如何使用trie(或其他数据结构或算法)通过前缀有效搜索多个单词?
例如:假设这是我的数据集:
trie数据结构允许我有效地检索以“ Bo ”开头的所有名称(因此不会迭代所有名称)。但我也希望通过前缀搜索姓氏,因此搜索“ Wa ”应该找到“Bobby Walker”。并且使事情变得复杂:当用户搜索“ Bo Wa ”时,这也应该找到相同的名称。我该如何实现呢?我应该为名称的每个部分使用单独的trie结构吗? (以及如何结合结果)?
背景:我正在为大型地址簿(10000多个名字)编写搜索功能。我希望有一个非常快速的自动完成功能,当人们输入第一个&的前几个字母时显示结果。姓。我已经有一个使用正则表达式的解决方案,但它需要遍历所有要减慢的名称。
答案 0 :(得分:2)
非常好的数据结构是Burst Trie
答案 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('__doPostBack(\'ctl00$ContentPlaceHolder1$ctl00$dlProvinciaResidenza\',\'\')', 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>
个对象的数组(它们有Person
和firstName
字段。我们假设您有一个lastName
,并希望找到适合您prefix
的所有值。只需运行二元搜索,即可找到prefix
firstIndex
出现在prefix
的第一个位置(firstName
},另一个位置找{} {{1} }})。现在,您可以在lastIndex
中检索您的值。当你想通过O(lastIndex - firstIndex)
找到它们时也是如此。如果您有lastName
和prefixFirstName
,则可以搜索值与prefixLastName
匹配的时间间隔,然后在此时间间隔内,您可以检查与{{1}匹配的值}。总而言之,当你有一个或两个前缀时,你运行4次二进制搜索(每次搜索大约17次迭代,100k名称),这足够快,你可以在线性时间内检索它们。即使它不是最快的解决方案,我也建议它,因为它易于理解且易于编码。