【问题标题】:Data structure for Phonebook电话簿的数据结构
【发布时间】:2026-02-14 19:20:06
【问题描述】:

一家移动电话公司将推出一款现有智能手机的新型号,最大内存为 2 GB。作为一名程序员,您的任务是开发应用程序以更好地利用其电话簿资源。

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我会使用 trie

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

    来自*页面的特里树图片

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

    1. 在最坏的情况下,在 Trie 中查找数据会更快,O(m) 时间 (其中 m 是搜索字符串的长度),与不完美的比较 哈希表。一个不完美的哈希表可能有键冲突。这 不完美哈希表中最坏情况的查找速度是 O(N) 时间,但是 更典型的是 O(1),花费 O(m) 时间评估 哈希。
    2. 无需提供散列函数或更改散列 随着更多的键被添加到 trie 中。
    3. trie 可以通过键提供条目的字母顺序。

    根据 Wikipedia 页面,Trie 是一种非常适合表示预测文本或自动完成字典的数据结构。 为了存储电话号码,我们只需要在包含电话号码的 trie 末尾添加一个额外的节点。 此外,我们需要构建另一个 trie 来存储数字。在这种情况下,数字不是字母,而是特里树中的一个节点。最后一个节点,即叶节点,包含拥有该号码的人的姓名。通过使用这两个尝试,我们可以轻松实现电话簿。我们可以搜索该人的号码和/或姓名。

    *文章中的一段:

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

    【讨论】:

      【解决方案2】:

      我在编程方面不是很有经验,但我认为链式哈希可能是电话簿遵循的合适方法。我相信这种结构可以满足您提出的所有要求。

      1. 它只分配存储数据所需的内存以及下一个节点的指针,因为它是通过使用链表中动态分配的节点来实现的。
      2. 搜索、插入和删除都有 O(n) 最坏情况。更常见的是 0(hash(x))。
      3. 如果您按姓氏的第一个字母散列元素,您可以获得一些排序时间。您将获得需要排序的 26 个列表(如果所有名字都以字母开头)。并且链表有 O(n logn) 最坏的情况。

      希望我的回答没有搞砸。

      【讨论】: