用于查找某人姓名的电话号码的合适数据结构?

时间:2012-03-08 16:16:05

标签: data-structures

假设您要编写一个实现简单电话簿的程序。给定一个特定的名称,您希望能够尽快检索该人的电话号码。您将使用什么数据结构来存储电话簿?为什么?

6 个答案:

答案 0 :(得分:6)

下面的文字回答了你的问题。

  

在计算机科学中,哈希表或哈希图是一种数据结构   使用哈希函数来映射识别值,称为键(例如,a   个人姓名),与其相关联的值(例如,他们的电话   数)即可。因此,哈希表实现了一个关联数组。哈希   function用于将密钥转换为索引(哈希)   数组元素(槽或桶)对应的值所在的位置   寻求。

该文本来自wiki:hashtable。

还有一些进一步的讨论,比如碰撞,散列函数......查看维基页面了解详细信息。

答案 1 :(得分:5)

我尊重&爱哈希表:)但即使是平衡的二叉树也适合你的电话簿应用程序,在最坏的情况下会给你一个对数的复杂性,并避免你有更好的哈希函数,碰撞等,这更适合于大量的数据。

当我谈论大数据时,我的意思是与存储相关的东西。每次在散列表中填充所有桶时,您将需要分配新存储并重新散列所有内容。如果您提前知道数据的大小,则可以避免这种情况。平衡的树木不会让你陷入这些问题。在设计数据结构时也需要考虑域,例如小型设备存储很重要。

答案 2 :(得分:2)

我想知道为什么'Tries'没有出现在其中一个答案中, Tries适用于电话簿类数据。

此外,与HashTable相比,以相同的成本(几乎)节省了检索效率,(假设字母大小不变,名称长度恒定)

尝试也有助于搜索时有时需要'Prefix Matches'

答案 3 :(得分:1)

字典既动态又快速。

答案 4 :(得分:0)

您需要一个字典,其中您使用名称作为键,并将数字作为存储的数据。看看这个:http://en.wikipedia.org/wiki/Dictionary_%28data_structure%29

答案 5 :(得分:0)

为什么不使用单链表?每个节点都有名称,编号和链接信息。

一个缺点是您的搜索可能需要一些时间,因为您必须从链接到链接遍历整个列表。您可以在节点插入时自己订购列表!

PS:为了使搜索更快一些,请保持指向列表中间的链接。搜索可以根据此节点上“名称”字段的值继续到列表的左侧或右侧。请注意,这需要一个双向链表。