Android - 优化应用程序的启动

时间:2011-06-20 22:22:15

标签: android optimization data-structures implementation trie


编辑:


我遵循了你的好建议,我使用了一个特里数据结构来包含我的词典。我选择的结构是this one感兴趣的人。

但是现在我还有另一个问题:每次启动应用程序时构建我的trie数据结构都太长了!也许我的词典太庞大了,或者我选择的trie的实现太不适合简单的词典。

即使在像注册数据库关闭应用程序之后,或者如果您认为问题是由实施引起的,您是否有办法保存此结构?您可以向我推荐另一个吗?


我的android项目存在严重问题。

这里的目标是计算所有可以用6个字母组成的单词

要做到这一点,我的BDD中有两张表:

  • 'words'有两列:'_ id'和'mots'
  • 和'temp'临时表 列相同。

'words'包含词汇表的所有单词(它很大),'temp'包含所有可能用6个字母组成的字母组合(至少使用3个字母)。

我试着在表'temp'中选择真实的单词,这是表'单词'中的单词。这是我的代码:

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

db.execSQL("CREATE TABLE temp2 (_id integer primary key autoincrement, mots text not null);");
db.execSQL("INSERT INTO temp2 (_id, mots) SELECT * FROM words WHERE mots like '%"+lettres.tab_char.get(0)+"%' OR mots like '%"+lettres.tab_char.get(1)+"%' "
                    + "OR mots like '%"+lettres.tab_char.get(2)+"%' OR mots like '%"+lettres.tab_char.get(3)+"%' OR mots like '%"+lettres.tab_char.get(4)+"%' "
                    + "OR mots like '%"+lettres.tab_char.get(5)+"%';");

(lettre.tab_char是一个ArrayList(Character),其中包含用于在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);

之后我将我的值放入列表视图中。

它有效,但它真的很慢:你能帮帮我吗?

2 个答案:

答案 0 :(得分:1)

通常,您使用的算法效率非常低。首先,您使用通配符匹配搜索每个条目6次,然后再次将这个巨大的结果与整个数据集结合起来。

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

有很多方法可以实现这一目标,但找到合适的解决方案取决于您的要求。这些字母可以重复吗?词汇量有多大“庞大”?它仍然适合几MB?这种查找是否需要接近即时发生?

<强>更新

鉴于你的要求,我必须同意乔。它实际上更像是一种数据结构,而不是一种算法,但它是一种方法。你应该能够在加载应用程序时构建一次trie,然后每个“匹配”将是一个相当简单的查找,沿着trie走。

答案 1 :(得分:1)

您正在寻找的算法实际上称为“trie”(re trie val的缩写)。它们非常非常适合这种类型的计算(Android实际上在SMS和邮件应用程序中使用它们来执行表情符号替换等操作)。如果操作正确,您会对从中获得的性能感到惊讶。我同意Paul的观点:你肯定不应该像你现在那样进行查询。实际上,许多实现甚至会将整个字典文件加载到内存中的trie中,并在整个应用程序的生命周期中使用该trie进行单词查找和验证。拼字游戏单词列表(链接也包含在下面的问题中:twl06.zip)仅为1.9MB,包含178k个单词。内存中的trie实际上应该远小于1.9MB,因为多个单词将共享公共前缀(例如,“stair”和“stare”将共享STA前缀,然后分支到两个叶子[“I”和“R”],等等......)

这是一个很好的起点:Algorithm to generate anagrams