假设您要编写一个实现简单电话簿的程序。给定一个特定的名称,您希望能够尽快检索该人的电话号码。您将使用什么数据结构来存储电话簿?为什么?
答案 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:为了使搜索更快一些,请保持指向列表中间的链接。搜索可以根据此节点上“名称”字段的值继续到列表的左侧或右侧。请注意,这需要一个双向链表。