如何从庞大的数据库中搜索给定的单词?

时间:2013-03-19 08:54:38

标签: java algorithm data-structures search-engine

从词典数据库中搜索单词的最有效方法是什么。我搜索了答案,人们建议使用trie数据结构。但是为大量单词创建树的策略是加载主存储器。我正在尝试制作一个Android应用程序,它涉及我的数据结构项目的这个实现。所以有人能告诉我这本词典是如何运作的。

即使我在手机中使用t9词典,单词的建议也会在屏幕上显示。很想知道算法及其背后的设计。

3 个答案:

答案 0 :(得分:8)

您可以使用最有用的Trie来搜索大词典。因为太多的单词正在使用类似的启动,所以在常量因子搜索周围的trie brgins也可以使用到位,对物理内存的访问次数有限。您可以在web中找到大量实现。

如果某人不熟悉特里,我认为this网站很好,我只是在这里引用他们的示例:

  

trie(来自检索),是一种有用的多路树结构   将字符串存储在字母表中。它已被用于存储大型   拼写检查程序中的英语词典(比如说)   在自然语言“理解”程序中。鉴于数据:

an, ant, all, allot, alloy, aloe, are, ate, be 
     

相应的trie将是:   Sample Trie for above words

这是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”,其中内存浪费非常少,但时间复杂度高于三元组。