Android-优化应用程序的启动

Android-优化应用程序的启动,android,optimization,data-structures,implementation,trie,Android,Optimization,Data Structures,Implementation,Trie,编辑: 我遵循了你的好建议,并使用了trie数据结构来包含我的措辞。我选择的结构是为感兴趣的人设计的 但现在我有另一个问题:每次启动应用程序时构建trie数据结构的时间太长了!也许我的字典太大了,或者我选择的trie的实现对于一个简单的字典来说太不合适了 那么,有没有一种方法可以在关闭应用程序(如注册数据库)后保留此结构,或者如果您认为问题是由实现引起的,您可以向我推荐另一个吗 我的android项目有一个严重的问题 这里的目标是计算所有可以由6个字母组成的系列词 为此,我的BDD中有两个表

编辑:


我遵循了你的好建议,并使用了trie数据结构来包含我的措辞。我选择的结构是为感兴趣的人设计的

但现在我有另一个问题:每次启动应用程序时构建trie数据结构的时间太长了!也许我的字典太大了,或者我选择的trie的实现对于一个简单的字典来说太不合适了

那么,有没有一种方法可以在关闭应用程序(如注册数据库)后保留此结构,或者如果您认为问题是由实现引起的,您可以向我推荐另一个吗


我的android项目有一个严重的问题

这里的目标是计算所有可以由6个字母组成的系列词

为此,我的BDD中有两个表:

  • “单词”有两列:“\u id”和“mots”
  • 和临时桌子 使用相同的列
“words”包含所有词汇表中的单词(非常庞大),“temp”包含所有可能的字母组合,这些字母组合可以由6个字母组成(至少使用3个字母)

我试图在表格“temp”中选择真实的单词,因此表格“words”中的单词。下面是我的代码:

我首先选择包含好字母的单词(至少使用3个字母)

(lettre.tab_char是一个数组列表(字符),其中包含用于在temp中进行组合的字母)

我在“temp2”和“temp”表之间进行联接:

String MY_QUERY = "SELECT temp2._id, temp2.mots FROM temp2 INNER JOIN temp ON temp2.mots = temp.mots;";
Cursor test =  db.rawQuery(MY_QUERY, null);
之后,我将我的值放入listview


它可以工作,但速度非常慢:你能帮我吗?

一般来说,你使用的算法效率非常低。首先,使用通配符匹配对每个条目进行6次搜索,然后再次将这个巨大的结果与整个数据集连接起来

SQL可能不适合这样做。SQL擅长查询,这更像是一种计算。在代码中进行匹配

有很多方法可以实现这一点,但找到正确的解决方案取决于您的需求。这些字母能重复吗?“巨大”一词的词汇量有多大?它还可以容纳几MB吗?这种查找是否需要几乎同时进行

更新:


考虑到你的要求,我不得不同意乔的意见。它实际上更像是一种数据结构,而不是一种算法,但trie才是最好的选择。您应该能够在加载应用程序时构建一次trie,然后每个“匹配”都将是一个相当简单的查找,沿着trie进行。

您要查找的算法实际上称为“”(检索的缩写)。它们非常适合这种类型的计算(Android实际上在短信和邮件应用中使用它们来做表情替换之类的事情)。如果做得好,你会对它的性能感到惊讶。我同意Paul的观点:你绝对不应该像现在这样做。事实上,许多实现甚至会将整个字典文件加载到内存中的trie中,并在应用程序的整个生命周期中使用该trie进行单词查找和验证。拼字列表(链接也包含在下面的问题中:)只有1.9MB,包含178k个单词。内存中的trie实际上应该比1.9MB小得多,因为多个单词将共享相同的前缀(例如,“stair”和“stare”都将共享S-T-A前缀,然后这些前缀将分支为两个叶子[“I”和“R”],依此类推……)


这里有一个很好的起点:

首先,感谢您的关注。事实上,我想设计一个基于字谜的游戏:你有6个字母,你必须输入所有可以用这些字母重新制作的单词(字母只能按时使用)。所以我有一个算法,可以生成6个字母的序列。我有我用这个算法生成的单词表(379000个条目)和组合表:这些SQL查询是我找到的生成每个级别的解决方案的方法。谢谢你的回答。如果我理解正确,你是说我应该保留生成字母组合的算法,但我应该用trie数据结构(我的单词列表)测试生成的单词。
String MY_QUERY = "SELECT temp2._id, temp2.mots FROM temp2 INNER JOIN temp ON temp2.mots = temp.mots;";
Cursor test =  db.rawQuery(MY_QUERY, null);