Algorithm 搜索手机通讯簿
如果一部手机只有一个数字键盘,我们需要以一种能够快速搜索的方式存储联系人 用户将输入号码,我们必须在地址簿中显示所有以这些号码对应的字母开头的联系人 我在一次采访中被问到这一点,我建议创建一个trie。对于地址簿中的每个姓名,我建议在trie中添加相应的号码 因此,如果通讯簿具有以下联系人:Algorithm 搜索手机通讯簿,algorithm,trie,Algorithm,Trie,如果一部手机只有一个数字键盘,我们需要以一种能够快速搜索的方式存储联系人 用户将输入号码,我们必须在地址簿中显示所有以这些号码对应的字母开头的联系人 我在一次采访中被问到这一点,我建议创建一个trie。对于地址簿中的每个姓名,我建议在trie中添加相应的号码 因此,如果通讯簿具有以下联系人: bob boby mat mav 我将使用相应的数字创建尝试。在这种情况下,trie将包含: 262 (At the 2nd node 2, keep a pointer to bob) 262
bob
boby
mat
mav
我将使用相应的数字创建尝试。在这种情况下,trie将包含:
262 (At the 2nd node 2, keep a pointer to bob)
2629 (At the node 9, keep a pointer to boby)
628 (At the node 8, keep 2 pointers, one to each of mat & mav)
有没有更好的办法
更新:此trie用于此处描述的T9技术我怀疑大多数名称在前几个字符内会有所不同(例如,列表中的“Theodore”、“Theodore”、“Theodora”将构成一个遥远的异常值) 在此基础上,您可以使用比trie简单得多的东西,即将前缀映射到匹配项列表的哈希表(一旦前缀唯一地确定了列表中的名称,您就不需要再进一步了) 例如,给定
{bob,bobby,matt,mads,zed}
您将得到哈希表
"b" --> [bob, bobby]
"bo" --> [bob, bobby]
"bob" --> [bob, bobby]
"bobb" --> [bobby]
"m" --> [matt, mads]
"ma" --> [matt, mads]
"mat" --> [matt]
"mad" --> [mads]
"z" --> [zed]
请注意,“无差别”前缀(例如,“b”、“bo”、“bob”)可以共享它们的值列表
如果平均公共前缀是k个字符,那么开销是k个哈希表条目的一个因素。如我所怀疑的,如果k很小,那么最终会得到一个比trie更精简、更简单的数据结构。可以根据字母构建一个树,但它需要是三个值,左、右、电话号码列表 以你的例子来说:
root node
b (left node) m (right node)
o a
b (number) v t
y (number)
然后,您可以沿着节点向下走,以显示自动完成建议,例如,在bob
和boby
的情况下,如果需要,您可以同时显示这两个名称
更新
今天早上我考虑了一下,这篇文章可能会对如何处理这个问题给出一些新的想法,因为它使用三元树对字符串进行排序
但是,如果我的示例中的节点有5个值,那么您有:
这样,每个节点中的每个字母都没有26个指针,所以这棵树是稀疏的,但很可能是不平衡的。平衡可能是另一个问题。如果您的示例中有bob、boby等的电话号码,这会有所帮助。James,实际的电话号码并不重要。用户正在搜索名称而不是电话号码。如果我理解正确,那么这棵树不需要26路分支吗?每个字母a-z对应一个分支?@user674669-这可能是最好的方法。我没有完全考虑实现,因为我从来没有这样做的必要。我希望你可以用4个值来计算,如果你还有一个整数来表示字母的顺序。有几种方法可以做到这一点。