【问题标题】:Suitable data structure for finding a person's phone number, given their name?给定他们的名字,找到一个人的电话号码的合适数据结构?
【发布时间】:2012-03-08 16:16:04
【问题描述】:

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

【问题讨论】:

  • 即使您的问题很紧急,下次请在问题标题上再思考一下。我已尝试为您改写它,以便它比“帮助!数据结构!”更具体一点。

标签: data-structures


【解决方案1】:

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

在计算机科学中,哈希表或哈希映射是一种数据结构, 使用散列函数来映射标识值,称为键 (例如, 人的名字),到他们的关联值(例如,他们的电话 号)。因此,哈希表实现了关联数组。哈希 函数用于将键转换为索引(哈希) 对应值所在的数组元素(槽或桶) 被寻找。

文本来自 wiki:hashtable。

还有一些进一步的讨论,例如碰撞、哈希函数...查看 wiki 页面了解详细信息。

【讨论】:

  • 谢谢。我只需要正确的结构。我有些熟悉的细节。想获得第二意见。再次感谢。
  • 好吧。我理解解决方案。如果我们必须存储两个同名的不同人的电话号码怎么办?
  • @Sandeep 根据规范,这是不可能的。如果你有一本电话簿,里面有两个“John Doe”,一个是电话号码 112233,一个是电话号码 445566,我让你给我 John Doe 的电话号码,你会怎么做?那么你唯一能做的就是给我两个数字。 (对应于将每个名称映射到电话号码列表的哈希图)。但是,理想情况下,您需要一些独特的东西作为键。也许,如果信息可用,社会安全号码可以用作哈希映射中的键。
【解决方案2】:

我尊重并喜欢哈希表 :) 但即使是平衡的二叉树也适用于您的电话簿应用程序,在最坏的情况下为您提供对数复杂性并避免您拥有良好的哈希函数、冲突等,这更适合大型数据量。

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

【讨论】:

  • 哇你们真好:) 我的第一个问题。我真的很喜欢你的解释 Yavar。
  • @user1257444:欢迎来到堆栈溢出的世界。这是工作中集体智慧的典型例子。成为其中的一部分。请将您的默认名称“user1257444”更改为有意义的名称,例如“蜘蛛侠”:)
【解决方案3】:

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

此外,与 HashTable 相比,在相同的检索效率成本(几乎)下节省空间,(假设字母大小不变且名称长度不变)

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

【讨论】:

    【解决方案4】:

    字典既动态又快速。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        一个缺点是您的搜索可能需要一些时间,因为您必须从一个链接到另一个链接遍历整个列表。您可以在插入节点时对列表进行排序!

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

        【讨论】:

        • 你的后记需要一个双向链表;但是您提出了一个单链表(顺便说一句。由于您提到的线性搜索时间问题,我不建议解决此问题)。
        • @stakx:感谢您指出我 ps 中的错误。忘了提到那里的双向链表。
        猜你喜欢
        • 2012-02-09
        • 2011-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多