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

时间:2016-05-30 20:19:11

标签: algorithm search tree prefix trie

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

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

  • Alice Jones
  • Bob Smith
  • Bobby Walker
  • John Doe
  • (总共10000个名字)

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

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

3 个答案:

答案 0 :(得分:2)

非常好的数据结构是Burst Trie

Scala implementation

答案 1 :(得分:2)

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

答案 2 :(得分:1)

我认为排序数组也适合您的要求,包含 <span id="Span1">provincia</span> <select name="ctl00$ContentPlaceHolder1$ctl00$dlProvinciaResidenza" onchange="javascript:setTimeout(&#39;__doPostBack(\&#39;ctl00$ContentPlaceHolder1$ctl00$dlProvinciaResidenza\&#39;,\&#39;\&#39;)&#39;, 0)" id="ContentPlaceHolder1_ctl00_dlProvinciaResidenza" tabindex="5" class="form-control input-sm"></select> <span id="ContentPlaceHolder1_ctl00_Label3">Comune</span> <select name="ctl00$ContentPlaceHolder1$ctl00$dlComuneResidenza" id="ContentPlaceHolder1_ctl00_dlComuneResidenza" tabindex="6" class="form-control input-sm"> </select> </html>个对象的数组(它们有PersonfirstName字段。我们假设您有一个lastName,并希望找到适合您prefix的所有值。只需运行二元搜索,即可找到prefix firstIndex出现在prefix的第一个位置(firstName},另一个位置找{} {{1} }})。现在,您可以在lastIndex中检索您的值。当你想通过O(lastIndex - firstIndex)找到它们时也是如此。如果您有lastNameprefixFirstName,则可以搜索值与prefixLastName匹配的时间间隔,然后在此时间间隔内,您可以检查与{{1}匹配的值}。总而言之,当你有一个或两个前缀时,你运行4次二进制搜索(每次搜索大约17次迭代,100k名称),这足够快,你可以在线性时间内检索它们。即使它不是最快的解决方案,我也建议它,因为它易于理解且易于编码。