Data structures 用于查找人员的合适数据结构';s的电话号码,他们的名字?

Data structures 用于查找人员的合适数据结构';s的电话号码,他们的名字?,data-structures,Data Structures,假设您想编写一个实现简单电话簿的程序。给定一个特定的名字,您希望能够尽快检索此人的电话号码。您将使用什么数据结构来存储电话簿?为什么?下面的文字回答了您的问题 在计算机科学中,哈希表或哈希映射是 使用哈希函数映射标识值,称为键(例如 人员姓名),并将其关联值(例如,其电话 编号)。因此,哈希表实现了一个关联数组。散列 函数用于将键转换为 数组元素(槽或桶),其中对应的值是 被寻找 文本来自wiki:hashtable 还有一些进一步的讨论,比如冲突,散列函数。。。查看wiki页面了解详细信息。我

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

下面的文字回答了您的问题

在计算机科学中,哈希表或哈希映射是 使用哈希函数映射标识值,称为键(例如 人员姓名),并将其关联值(例如,其电话 编号)。因此,哈希表实现了一个关联数组。散列 函数用于将键转换为 数组元素(槽或桶),其中对应的值是 被寻找

文本来自wiki:hashtable


还有一些进一步的讨论,比如冲突,散列函数。。。查看wiki页面了解详细信息。

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


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

字典既动态又快速。

您需要一个字典,其中使用名称作为键,使用数字作为存储的数据。查看此信息:

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

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


PS:为了使搜索速度加快一点,请在列表中间保留一个链接。根据此节点上“名称”字段的值,搜索可以继续在列表的左侧或右侧进行。请注意,这需要一个双链接列表。

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

此外,与HashTable相比,它节省了空间,但检索效率(假设字母表大小不变,名称长度不变)


搜索时,有时需要使用
“前缀匹配”

即使您的问题很紧急,下次,请在问题标题上反映更长的时间。我试图为您重新表述它,使它比“帮助!数据结构!”更具体一点。谢谢。我所需要的就是正确的结构。细节我有些熟悉。想得到第二个意见。再次感谢,好的。我明白解决办法。如果我们必须存储两个同名的不同人的电话号码呢?@Sandeep根据规范,这是不可能的。如果你有一本包含两个“约翰·多伊”的电话簿,一个电话号码是112233,另一个电话号码是445566,我让你给我约翰·多伊的电话号码,你会怎么做?你唯一能做的就是把两个数字都给我。(对应于将每个姓名映射到电话号码列表的hashmap)。然而,在理想情况下,你会想要一些独特的东西作为钥匙。也许,如果信息可用,社会保险号码可以作为散列图中的密钥。哇,你们很好:)我的第一个问题在这里。我真的很喜欢你的解释。@user1257444:欢迎来到堆栈溢出的世界。这是工作中集体智慧的典型例子。请将您的默认名称“user1257444”更改为有意义的名称,例如“蜘蛛侠”:)您的postscript需要一个双链接列表;不过,你提出的是一个单链表(顺便说一句,我不推荐这个问题,因为你提到的线性搜索时间问题)。@stakx:谢谢你指出我ps中的错误。忘了提到那里的双链表。