【发布时间】:2012-03-08 16:16:04
【问题描述】:
假设您要编写一个程序来实现一个简单的电话簿。给定一个特定的姓名,您希望能够尽快检索该人的电话号码。你会使用什么数据结构来存储电话簿,为什么?
【问题讨论】:
-
即使您的问题很紧急,下次请在问题标题上再思考一下。我已尝试为您改写它,以便它比“帮助!数据结构!”更具体一点。
标签: data-structures
假设您要编写一个程序来实现一个简单的电话簿。给定一个特定的姓名,您希望能够尽快检索该人的电话号码。你会使用什么数据结构来存储电话簿,为什么?
【问题讨论】:
标签: data-structures
下面的文字回答了你的问题。
在计算机科学中,哈希表或哈希映射是一种数据结构, 使用散列函数来映射标识值,称为键 (例如, 人的名字),到他们的关联值(例如,他们的电话 号)。因此,哈希表实现了关联数组。哈希 函数用于将键转换为索引(哈希) 对应值所在的数组元素(槽或桶) 被寻找。
文本来自 wiki:hashtable。
还有一些进一步的讨论,例如碰撞、哈希函数...查看 wiki 页面了解详细信息。
【讨论】:
我尊重并喜欢哈希表 :) 但即使是平衡的二叉树也适用于您的电话簿应用程序,在最坏的情况下为您提供对数复杂性并避免您拥有良好的哈希函数、冲突等,这更适合大型数据量。
当我谈到海量数据时,我的意思是与存储相关的东西。每次填充哈希表中的所有存储桶时,您都需要分配新的存储空间并重新哈希所有内容。如果您提前知道数据的大小,则可以避免这种情况。平衡树不会让你陷入这些问题。在设计数据结构时也需要考虑域,例如小型设备的存储就很重要。
【讨论】:
我想知道为什么“尝试”没有出现在其中一个答案中,
Tries 适用于电话簿类数据。
此外,与 HashTable 相比,在相同的检索效率成本(几乎)下节省空间,(假设字母大小不变且名称长度不变)
尝试还有助于在搜索时有时需要'Prefix Matches'。
【讨论】:
字典既动态又快速。
【讨论】:
您需要一个字典,其中使用名称作为键,使用数字作为存储的数据。看看这个:http://en.wikipedia.org/wiki/Dictionary_%28data_structure%29
【讨论】:
为什么不使用单链表?每个节点都会有名称、编号和链接信息。
一个缺点是您的搜索可能需要一些时间,因为您必须从一个链接到另一个链接遍历整个列表。您可以在插入节点时对列表进行排序!
PS:为了使搜索更快一点,请保持到列表中间的链接。根据该节点“名称”字段的值,可以继续向列表的左侧或右侧搜索。请注意,这需要一个双向链表。
【讨论】: