地址簿和特里结构

时间:2012-06-06 21:16:29

标签: algorithm search addressbook prefix-tree patricia-trie

我有一个问题要问你。我必须实现一个包含30000个名称的商业地址簿。所有名称都包含名字和姓氏。 我必须实现一个自动完成文本框,不仅可以搜索名字,还可以搜索姓氏。 在google上搜索我已经看到这个问题是使用patricia trie解决的,但它只是前缀搜索所以如果我创建一个带有firstname + lastname的trie,我怎样才能搜索firstname而不是lastname?

我是否必须复制插入两个字符串的条目? 名字+姓氏 和 姓氏+姓名

请帮帮我!!!

搜索必须非常有效。

感谢。

2 个答案:

答案 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 ++)。