我有一个问题要问你。我必须实现一个包含30000个名称的商业地址簿。所有名称都包含名字和姓氏。 我必须实现一个自动完成文本框,不仅可以搜索名字,还可以搜索姓氏。 在google上搜索我已经看到这个问题是使用patricia trie解决的,但它只是前缀搜索所以如果我创建一个带有firstname + lastname的trie,我怎样才能搜索firstname而不是lastname?
我是否必须复制插入两个字符串的条目? 名字+姓氏 和 姓氏+姓名
请帮帮我!!!
搜索必须非常有效。
感谢。
答案 0 :(得分:2)
另一种可能性是创造两次尝试。
第一个(让它为T1
)用于名字,第二个用(T2
)用于姓氏。
从T1
中的每个单词终止符(通常表示为$
符号)构造trie时,在T2
中添加指向相关条目的指针列表,反之亦然
即。如果John Doe是一个主菜:
T1:
J
|
O
|
H
|
N
|
$1
T2:
D
|
O
|
E
|
$2
$ 1将包含一个列表,包含指向$ 2的指针,而$ 2将包含一个包含$ 1的列表。
每个前缀搜索将在两次尝试中搜索,让您自动完成,然后使用指针获取全名(部分搜索仅为您提供名/姓,使用指针获得第二名)。
通过在两次尝试中搜索来搜索全名(查找T1
中的名字和T2
中的姓氏),然后获取相关的$1
和{{分别为1}},然后你需要检查指针是否匹配($2
中的列表l1
包含$1
,$2
中的列表l2
包含$2
)。如果他们这样做 - 名字就在字典里。
注意,一旦你有一个指向$1
节点的指针,就可以简单地返回到trie,直到你到达root获取这个$
符号代表的单词。 (需要指向每个节点的父节点)
另请注意:我解释了简单的尝试,但实际上没有理由不使用patricia尝试,而是使用相同的方法。
答案 1 :(得分:0)
是的,最简单的解决方案是插入两种变体。但是,这应该只复制搜索字符串,而不是条目。您可能想要以某种方式规范化名字和姓氏之间的分隔(=删除地址簿和用户输入的标点符号),因此您将在所有情况下找到输入的条目,例如“John Doe”,“Doe” ,John“,”Doe John“等。
我不会使用部分trie而只是一棵平衡的树。在许多语言中,您会发现平衡树作为库中的有序映射实现(至少Java和C ++)。