按前缀搜索多个单词(trie数据结构)

问题描述 投票:1回答:3

如何使用trie(或其他数据结构或算法)通过前缀有效地搜索多个单词?

例如:假设这是我的数据集:

  • 爱丽丝琼斯
  • 鲍勃史密斯
  • 鲍比沃克
  • 约翰·多伊
  • (总共10000个名字)

trie数据结构允许我有效地检索以“Bo”开头的所有名称(因此不会迭代所有名称)。但我也希望通过前缀搜索姓氏,因此搜索“Wa”应该找到“Bobby Walker”。并且使事情变得复杂:当用户搜索“Bo Wa”时,这也应该找到相同的名称。我该如何实现呢?我应该为名称的每个部分使用单独的trie结构吗? (以及如何结合结果)?

背景:我正在为大型地址簿(10000多个名字)编写搜索功能。我希望有一个非常快的自动完成功能,当人们输入名字和姓氏的前几个字母时显示结果。我已经有一个使用正则表达式的解决方案,但它需要迭代所有要减慢的名称。

algorithm search tree prefix trie
3个回答
2
投票

您可以使用反向字符串和通配符搜索尝试第二个trie:http://phpir.com/tries-and-wildcards/


2
投票

一个非常好的数据结构将是Burst Trie

有一个Scala implementation


1
投票

我认为排序的数组也适合你的要求,一个包含Person对象的数组(它们有一个firstName和一个lastName字段)。假设您有一个prefix,并希望找到适合您的prefix的所有值。只需运行二分搜索,找到你的firstIndex出现在prefix上的第一个位置(比方说是firstName),另外一个找到最后一个位置(lastIndex)。现在,您可以在O(lastIndex - firstIndex)中检索您的值。当你想通过lastName找到它们时也是如此。当你有prefixFirstNameprefixLastName时,你可以搜索prefixFirstName值匹配的区间,然后在这个区间内,你可以检查与prefixLastName匹配的值。总而言之,当你有一个或两个前缀时,你运行4次二进制搜索(每次搜索大约17次迭代,100k名称),这足够快,你可以在线性时间内检索它们。即使它不是最快的解决方案,我也建议它,因为它易于理解且易于编码。

© www.soinside.com 2019 - 2024. All rights reserved.