【问题标题】:Is a data structure implementation with O(1) search possible without using arrays?是否可以在不使用数组的情况下实现具有 O(1) 搜索的数据结构?
【发布时间】:2011-04-15 02:05:53
【问题描述】:

我目前正在学习数据结构的大学课程,这个话题已经困扰了我一段时间(这不是家庭作业,只是一个纯粹的理论问题)。

假设您要实现一个字典。当然,字典应该有一个搜索功能,接受一个键并返回一个值

现在,我只能想象 2 种非常通用的方法来实现这样的事情:

  • 使用某种搜索树,这将(总是?)给出 O(log n) 最坏情况下的运行时间来通过键查找值,或者,
  • 对键进行散列运算,本质上返回一个自然数,该自然数对应于值数组中的索引,给出 O(1) 最坏情况的运行时间。

如果不使用数组,搜索函数的运行时间是否可能为 O(1)最坏情况

是否只能通过使用数组进行随机访问?
是否可以通过使用基于指针的数据结构(如链表、搜索树等)?

在做出一些特定假设时是否可能,例如,键是按某种顺序排列的?

换句话说,你能想到搜索函数和字典的实现(如果可能的话),它将接收字典中的任何键并返回其值 O (1) 时间,不使用数组进行随机访问?

【问题讨论】:

  • 如果你有完美的散列,散列表在最坏的情况中只有 O(1)。在实践中,散列表在平均情况中为 O(1),在最坏情况下通常为 O(n)。
  • 有趣的见解。我对哈希表的实现方式不是很熟悉,它们通常不是像我建议的第二种方法那样实现吗?
  • 是的,但在实际用例中,您需要考虑哈希冲突。 Wikipedia 有一个简单的概述,可以帮助您入门。
  • 考虑哈希冲突意味着每个表条目可能包含多个值,因此它必须有一个数组。根据您对“无数组”要求的解释有多严格,这可能意味着此问题不允许使用哈希表解决方案。
  • @Sherm:表条目可能有链表,所以更具体地说,“没有数组”意味着没有可以像问题中的第二种方法一样使用的数组 - 防止随机访问数组.

标签: data-structures theory performance


【解决方案1】:

Here's another answer I made on that general subject. 本质上,算法通过处理一定数量的信息来达到其结果。他们所花费的时间取决于他们能多快做到这一点。

只有 2 个分支的决策点不能处理超过 1 位的信息。但是,具有 n 个分支的决策点最多可以处理 log(n) 位(基数为 2)。

我知道,在计算机中,可以在单个操作中处理超过 1 位信息的唯一机制是索引,无论是索引数组还是执行跳转表(即索引数组)。

【讨论】:

  • 谢谢你,这是一个很好的答案!
【解决方案2】:

查找 O(1) 的原因不是使用数组,而是查找时间不依赖于数据存储的大小。因此,任何直接访问数据的方法,在某种程度上没有与数据存储大小成比例的搜索,都是 O(1)。

【讨论】:

  • 这是正确的,例如,当访问数组中的第 i 个项目,或者找到一些堆/树的最小值/最大值时。我想知道包含 N 个元素的集合是否可能。
  • @GeReV,我不太确定你在问什么。一个数组有 N 个元素。
  • 我问的是,例如,搜索树、堆等的某些实现是否不使用数组作为底层实现,但仍保持 O(1) 搜索运行次。
  • @GeReV,一棵树本质上具有根和分支,根据树的平衡方式,通常从根开始以指数方式扩展大小。因此,如果我们通过根访问一棵树,我们将始终有 θ(log n) 平均运行时间。这仅仅是因为访问的节点数与 log n 成正比。所以答案是否定的,没有 O(1) 树实现。
  • 我会尝试以不同的方式解释我的问题。这个问题不是专门关于树、向量等的。我声称访问内存中随机项的唯一方法只能通过数组(即可预测的内存地址),并询问该声明是否正确。如果不是这样,是否可能有一些复杂的数据结构可以访问它的任何元素而不依赖于元素的数量,而不像哈希表那样将键转换为内存地址?
【解决方案3】:

您可以使用特里树实现哈希。复杂度是 O(max(length(string))),如果你有大小有限的字符串,那么你可以说它在 O(1) 中运行,它不取决于你在结构中拥有的字符串的数量。 http://en.wikipedia.org/wiki/Trie

【讨论】:

  • 是的,但是最小密钥大小仍然与 log n 成正比。所以随着 n 的增加,密钥也会增加。因此这仍然是一个 O(log n) 结构。
  • @ThomasMcLeod,虽然理论上你是对的,但这基本上是一个 B 树,就像一个数据库。只需少量挥手,您就可以将其视为线性时间查找。例如,如果我们允许“字符串”具有一个字节的整个值范围,那么长度为 5 的值可能超过一万亿。虽然它在技术上是 O(log n),但实际上 n 非常小,您可以认为它是常数。
猜你喜欢
  • 2021-11-19
  • 2019-01-14
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多