Algorithm 搜索手机通讯簿

Algorithm 搜索手机通讯簿,algorithm,trie,Algorithm,Trie,如果一部手机只有一个数字键盘,我们需要以一种能够快速搜索的方式存储联系人 用户将输入号码,我们必须在地址簿中显示所有以这些号码对应的字母开头的联系人 我在一次采访中被问到这一点,我建议创建一个trie。对于地址簿中的每个姓名,我建议在trie中添加相应的号码 因此,如果通讯簿具有以下联系人: bob boby mat mav 我将使用相应的数字创建尝试。在这种情况下,trie将包含: 262 (At the 2nd node 2, keep a pointer to bob) 262

如果一部手机只有一个数字键盘,我们需要以一种能够快速搜索的方式存储联系人

用户将输入号码,我们必须在地址簿中显示所有以这些号码对应的字母开头的联系人

我在一次采访中被问到这一点,我建议创建一个trie。对于地址簿中的每个姓名,我建议在trie中添加相应的号码

因此,如果通讯簿具有以下联系人:

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个值来计算,如果你还有一个整数来表示字母的顺序。有几种方法可以做到这一点。