【问题标题】:Android - Optimize the launch of an applicationAndroid - 优化应用程序的启动
【发布时间】:2011-06-20 22:22:15
【问题描述】:

编辑:


我听从了您的好建议,并使用了 trie 数据结构来包含我的字典。我为感兴趣的人选择的结构是this one

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

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


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

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

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

  • 'words' 有两列:'_id' 和 'mots'
  • 和 'temp' 一个临时表 具有相同的列。

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

我正在尝试在“temp”表中选择真实的单词,以便选择“words”表中的单词。这是我的代码:

我首先选择包含好字母的单词(至少使用 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);

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

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

【问题讨论】:

    标签: android optimization data-structures implementation trie


    【解决方案1】:

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

    SQL 可能不是执行此操作的正确位置。 SQL擅长查询,这更多的是计算。在代码中进行匹配。

    您可以通过多种方式实现此目的,但找到正确的解决方案取决于您的要求。字母可以重复吗? “巨大”的词汇量有多大?它仍然适合几 MB 吗?这种查找需要近乎即时发生吗?

    更新:

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

    【讨论】:

    • 首先,感谢您的关注。事实上,我想设计一个基于字谜的游戏:你有 6 个字母,你必须输入所有可以用这些字母重新组合的单词(字母只能按时使用)。所以我有一个生成一系列 6 个字母的算法。我有我的单词表(379 000 个条目)和我用这个算法生成的组合表:merriampark.com/comb.htm 这些 SQL 查询是我发现生成每个级别的解决方案的方法。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢你的回答乔。如果我理解正确,您是说我应该保留生成字母组合的算法,但我应该使用 trie 数据结构(我的单词列表)测试生成的单词。
    猜你喜欢
    • 1970-01-01
    • 2011-09-17
    • 2011-04-30
    • 2011-03-12
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 2013-05-23
    • 2011-09-13
    相关资源
    最近更新 更多