gpt4 book ai didi

android - 为包含 700 000 个单词的 Android 文字游戏声明 SQLite 表

转载 作者:行者123 更新时间:2023-11-29 20:28:42 25 4
gpt4 key购买 nike

Android 文字游戏(minSdkLevel=9 表示 SQLite 版本 3.6.22)-

screenshot

我想在 APK 文件中将字典作为预填充的 SQLite 表提供(在 SQLiteAssetHelper 的帮助下)。

在 SQLite 数据库中只有 1 个表:

create table dict (          /* contains 700 000 unique words */
word text not null
);

请问我的问题:

如何声明表以获得最佳性能以及使用哪种 SQL 查询?

(当检查玩家输入的单词是否存在于 dict 表中时 - 这将是应用程序中 SQLite 数据库的主要用途)。

我应该create index (是否可以为 text 列创建索引)?

或者我应该将 word 列声明为 primary key

还有一些 SQLite for Android guides建议在每个表中都有一个 _id 列(可能是为了能够获取最后插入的记录? - 我在这里并不真正需要)。我应该使用

create table dict (
_id integer primary key,
word text unique not null
);

create index word_index on dict(word);

还是会浪费 4 x 700 000 字节? (或者它是作为 _rowid_ 添加的吗?)

最佳答案

快速回答:是的,您可以在文本列上创建索引。

然而,为了获得最佳性能,这可能不是最佳选择。因为SQLite创建的索引应该是简单的b-tree(二叉树),通过二分查找来加快查找速度。也就是说,对于 700k 个单词,二进制搜索必须运行大约 20 个间隔。但这可能足够快,您需要对其进行测试才能真正了解性能。

一些替代方法是创建多个表(存储桶),例如将表创建为 wordA、wordB、wordC 等。并根据第一个字符来确定该词放在哪个表中。这会将每个表的大小降低到包含大约 27k 条记录。 (当然每个桶大小不一样)

通过这样做,它减少了执行二进制搜索所用的间隔。

而实际上应该使用hash函数来确定bucket,这样可以使每个bucket的大小更加均衡,可以自由控制bucket的个数。

而且您必须实际进行微调才能知道什么是最佳存储桶大小。

关于android - 为包含 700 000 个单词的 Android 文字游戏声明 SQLite 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32276936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com