编辑:
我遵循了你的好建议,我使用了一个特里数据结构来包含我的词典。我选择的结构是this one感兴趣的人。
但是现在我还有另一个问题:每次启动应用程序时构建我的trie数据结构都太长了!也许我的词典太庞大了,或者我选择的trie的实现太不适合简单的词典。
即使在像注册数据库关闭应用程序之后,或者如果您认为问题是由实施引起的,您是否有办法保存此结构?您可以向我推荐另一个吗?
我的android项目存在严重问题。
这里的目标是计算所有可以用6个字母组成的单词
要做到这一点,我的BDD中有两张表:
'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);
之后我将我的值放入列表视图中。
它有效,但它真的很慢:你能帮帮我吗?
答案 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