鉴于只有数字键盘的手机,我们需要以一种能够快速搜索的方式存储联系人。
用户将打入数字,我们必须在地址簿中显示所有以这些数字对应的字母开头的联系人。
我在接受采访时被问到这一点,我建议创建一个特里。对于地址簿中的每个名称,我建议将相应的号码添加到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技术Data structure behind T9 type of dictionary
答案 0 :(得分:0)
我怀疑大多数名字在前几个字符中区分自己(例如,在你的列表中有“Theodore”,“Theodor”,“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更简洁,更简单的数据结构。
答案 1 :(得分:0)
您可以根据信件构建一棵树,但它需要三个值,左,右,电话号码列表
所以用你的例子:
root node
b (left node) m (right node)
o a
b (number) v t
y (number)
然后,您可以向下走节点以显示自动完成建议,因为在bob
和boby
的情况下,如果需要,您可以显示这两个名称。
<强>更新强>
我今天早上想了一下,本文可能会对如何处理这个问题提出一些新的想法,因为它使用三元树来排序字符串。
http://www.cs.tufts.edu/~nr/comp150fp/archive/bob-sedgewick/fast-strings.pdf
但是,如果我的示例中的节点有5个值,那么您有:
然后向左或向右搜索,直到找到该位置的正确字母,然后向下,然后向左或向右搜索,直到找到下一个字母。
这样,每个节点中的每个字母都没有26个指针,因此这个树很稀疏,但很可能是不平衡的。平衡它将是一个不同的问题。