另一种可能性是创建两次尝试。
第一个(让它成为T1
)用于名字,第二个(让它成为T2
)用于姓氏。
当您构造 trie 时,从 in 中的每个单词终止符T1
(通常表示为$
符号)添加指向 in 中相关条目的指针列表,T2
反之亦然。
IE 如果 John Doe 是主菜:
T1:
J
|
O
|
H
|
N
|
$1
T2:
D
|
O
|
E
|
$2
$1 将保存一个包含指向 $2 的指针的列表,$2 将保存一个包含 $1 的列表。
每个前缀搜索都将搜索两次尝试,让您自动完成,然后使用指针获取全名(部分搜索只给您名字/姓氏,您使用指针获得第二个名字)。
搜索全名是通过在两次尝试中搜索完成的(在 中查找名字T1
和在 中查找姓氏,并分别T2
获取相关的和),然后您需要检查指针是否匹配(包含中的列表和列表在包含)。如果他们这样做 - 名字在字典里。$1
$2
l1
$1
$2
l2
$2
$1
请注意,一旦您有了指向该$
节点的指针,就可以简单地返回 trie,直到您到达根以获取该$
符号所代表的单词。(需要每个节点指向父节点的指针)
另请注意:我解释了简单的尝试,但实际上没有理由不使用帕特里夏尝试,使用相同的方法。