从词典数据库中搜索单词的最有效方法是什么。我搜索了答案,人们建议使用trie数据结构。但是为大量单词创建树的策略是加载主存储器。我正在尝试制作一个Android应用程序,它涉及我的数据结构项目的这个实现。所以有人能告诉我这本词典是如何运作的。
即使我在手机中使用t9词典,单词的建议也会在屏幕上显示。很想知道算法及其背后的设计。
答案 0 :(得分:8)
您可以使用最有用的Trie来搜索大词典。因为太多的单词正在使用类似的启动,所以在常量因子搜索周围的trie brgins也可以使用到位,对物理内存的访问次数有限。您可以在web中找到大量实现。
如果某人不熟悉特里,我认为this网站很好,我只是在这里引用他们的示例:
trie(来自检索),是一种有用的多路树结构 将字符串存储在字母表中。它已被用于存储大型 拼写检查程序中的英语词典(比如说) 在自然语言“理解”程序中。鉴于数据:
an, ant, all, allot, alloy, aloe, are, ate, be
相应的trie将是:
![]()
这是java中实用的Trie实现: http://code.google.com/p/google-collections/issues/detail?id=5
答案 1 :(得分:0)
有很多方法可以做到这一点。我前一段时间使用的那个(如果不对字典进行更改,则特别好)是创建前缀索引。
也就是说,您可以对词条进行排序。然后,保存不同首字母范围的(结束)位置。也就是说,如果您的条目的索引从1到1000,并且单词“aardvark - azerbaijan”的范围从1到200,则在单独的表“a | 200”中创建一个条目,然后您首先执行相同操作和第二封信。然后,如果您需要查找特定单词,则会大大缩小搜索范围。就我而言,前两个字母的索引就足够了。
同样,这种方法要求你使用像SQLite这样的数据库,我认为它存在于Android上。
答案 2 :(得分:-1)
使用trie确实是空间意识的,只是在我将trill加载150,000个单词后检查我的RAM使用情况时实现,使用量为150 MB(Trie是用C ++实现的)。内存消耗很大程度上是由于指针即可。我最终尝试了三次尝试,其内存浪费大约为30 MB(相比之下,150 MB),但时间复杂度有所增加。另一个选择是使用“Left child Right sibling”,其中内存浪费非常少,但时间复杂度高于三元组。