【问题标题】:how to search for a given word from a huge database?如何从庞大的数据库中搜索给定的单词?
【发布时间】:2013-03-19 08:54:38
【问题描述】:

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

即使我在手机中使用 t9 词典,单词建议也会很快出现在屏幕上。很想知道它背后的算法和设计。

【问题讨论】:

  • 这可能有助于了解 T9 how does T9 work
  • @MukulGoel Thanx.. 发现您的链接很有帮助。但是还没有测试我是否能够实现它.. 仍然从中学到了一些新东西.. 谢谢 :)
  • 你试过字典树吗..
  • @Ansh no 从来没有读过它。无论如何都会检查thanx :)

标签: java algorithm data-structures search-engine


【解决方案1】:

您可以使用Trie,这对于搜索大字典最有用。因为太多的词都在使用类似的启动,所以围绕常数因子搜索的尝试也可以在适当的位置使用,访问物理内存的次数有限。你可以在web找到很多实现。

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

trie(来自检索)是一种多路树结构,可用于 在字母表上存储字符串。它已被用于存储大 拼写检查程序中的英语(say)单词字典和 在自然语言“理解”程序中。给定数据:

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

相应的 trie 将是:

这是java中很好的实用Trie实现: http://code.google.com/p/google-collections/issues/detail?id=5

【讨论】:

  • 但是正如我在我的问题中提到的那样,在 Android 应用程序中创建 10,000 个单词的 trie 可能是一个问题。好吧,我的朋友说,为这么多单词加载 trie 会使手机强制退出应用程序:| ..
  • @AcesSmart,首先你说你的朋友建议你使用“tree”,但是一小时后当你看到答案和 cmets 时,你把它改成了“trie”,这是作弊,也是新的问题。也因为你不熟悉“trie”你这么想,这是无处不在的东西,比你的朋友“树”方法小得多,正如我在我的回答中所说,你可以“就地”使用它,意味着在没有加载到内存的情况下,很多搜索引擎都在使用“trie”,似乎你是世界上第一个说它不适用于你的移动应用程序。
  • 另外,如果您的问题有一些赞成是因为您提到您的朋友建议“树”方法,但如果他/她建议“trie”方法并且您仍然有问题,这是一个有趣的问题,我很确定你没有测试它。 (请记住,您的编辑在历史记录中可用,因此您不能完全更改您的问题,这也为我的答案的读者带来了很多变化,他们会说为什么我以这种方式回答这个问题,但您可以提出新问题)
  • 我写了 trie.. 有些人已将问题编辑为树:| .很抱歉给您带来不便..
  • @AcesSmart,我不知道您的问题是什么,如果您考虑 trie,请编辑您问题的这一部分:“但是创建 tree 的策略大量的单词将加载主记忆”,将其更改为“trie”,在这种情况下,你错了,正如我之前所说的(2次,在回答和评论中),首先你没有Trie 的内存问题,其次,即使您这么认为,trie 的主要优点是可以进行 in-place 搜索,这意味着无需在 primary memory 中获取。跨度>
【解决方案2】:

有很多方法可以做到这一点。我前段时间使用的一个(如果您不更改字典特别好)是创建前缀索引。

也就是说,您按照词汇学对条目进行排序。然后,为不同的首字母保存范围的(结束)位置。也就是说,如果您的条目具有从 1 到 1000 的索引,并且单词“aardvark -- azerbaijan”的范围从 1 到 200,那么您在单独的表“a | 200”中创建一个条目,然后您首先执行相同的操作和第二个字母。然后,如果您需要查找某个特定的词,则大大缩小了搜索范围。就我而言,前两个字母的索引就足够了。

同样,此方法需要您使用数据库,例如 SQLite,我认为它存在于 Android 上。

【讨论】:

    【解决方案3】:

    使用 trie 确实有空间意识,当我在将 150,000 个单词加载到 trie 后检查我的 RAM 使用情况时才意识到,使用量是 150 MB(Trie 是用 C++ 实现的)。内存消耗很大程度上是由于指针。我最终得到了三元尝试,它的内存浪费非常少,大约 30 MB(与 150 MB 相比),但时间复杂度有所增加。另一种选择是使用“左孩子右兄弟”,其中内存浪费非常少,但时间复杂度高于三元树。

    【讨论】:

      猜你喜欢
      • 2013-10-31
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 2012-09-04
      • 2013-05-16
      • 2014-03-12
      相关资源
      最近更新 更多