电话簿的数据结构

时间:2016-02-11 10:53:49

标签: data-structures tree hashmap binary-search-tree

一家手机公司将推出一款现有智能手机的新型号,最大内存为2千兆字节。作为程序员,您需要开发应用程序以更好地利用其电话簿资源。

您应该记住,单个联系人可以按字母顺序存储为“名字”,“姓氏”和“电话号码”。随着时间的推移,当电话簿中出现或删除新联系人时,电话簿会更新。

以下是执行所需任务时必须牢记的两个因素。

空间限制,因为您知道可用空间有限。访问特定联系人所需的时间不得超过给定的阈值。

作为程序员,您将使用哪种数据结构来执行上述任务,提供正确的理由来支持您的答案?

2 个答案:

答案 0 :(得分:1)

我将使用 trie

  

在计算机科学中,trie,也称为数字树,有时候是基数树或前缀树(因为它们可以通过前缀搜索),   有序树数据结构,用于存储动态集或   关联数组,其中键通常是字符串。与二进制不同   在搜索树中,树中没有节点存储与之关联的密钥   节点;相反,它在树中的位置定义了它的关键   已关联的。节点的所有后代都具有公共前缀   与该节点关联的字符串,与根关联   空字符串。价值观不一定与每个人相关   节点。相反,值往往只与叶子相关联,并与之相关   一些与感兴趣的键相对应的内部节点。为了   前缀树的空间优化表示,请参见紧凑前缀树。   在所示示例中,键列在下面的节点和值中   他们。每个完整的英文单词都有一个任意整数值   与之相关联。特里可以被视为树形的确定性   有限自动机。每个有限语言都由trie生成   自动机,每个特里可以压缩成确定性的   非循环有限状态自动机。

Image of trie from Wikipedia page

来自维基百科页面的特里图片

trie与二叉搜索树相比具有许多优点。还可以使用trie替换哈希表,它具有以下优点:

  1. 在最糟糕的情况下,在O(m)时间内查找trie中的数据会更快 (其中m是搜索字符串的长度),与不完美相比 哈希表。不完美的哈希表可能存在关键冲突。该 不完美哈希表中的最坏情况查找速度是O(N)时间,但是 更典型的是O(1),花费O(m)时间来评估 散列。
  2. 无需提供哈希函数或更改哈希 功能,因为更多的键被添加到trie。
  3. 特里可以按键按字母顺序排列。
  4. 根据维基百科页面,Trie是一个非常适合表示Predictive Text或Autocomplete词典的数据结构。 为了存储电话号码,我们只需要在包含电话号码的trie末尾添加一个额外的节点。 此外,我们需要构建另一个用于存储数字的trie。在这种情况下,number代替字母而成为trie中的节点。最后一个节点,即叶节点,包含拥有该号码的人员的姓名。通过使用这两次尝试,我们可以轻松实现电话簿。我们可以搜索该人的数量和/或姓名。

    维基百科文章中的一段:

      

    trie的常见应用是存储预测文本或   自动填充字典,例如在移动电话上找到的字典。这样   应用程序利用特里快速搜索的能力,   插入和删除条目

答案 1 :(得分:0)

我在编程方面不是很有经验,但我认为Hashing with Chaining可能是一种适合电话本的方法。我相信这种结构涵盖了你要求的所有要求。

  1. 它只分配存储数据所需的内存加上下一个节点的指针,因为它是通过在链表中使用动态分配的节点来实现的。
  2. 搜索,插入和删除都有O(n)最坏的情况。更常见的是0(hash(x))。
  3. 如果您按照姓氏的第一个字母对元素进行散列,则可以获得一些排序时间。您将获得26个列表(如果所有名字以字母开头),您需要对其进行排序。链接列表的最坏情况为O(n logn)。
  4. 我希望我没有弄清楚我的答案。