Data structures 是否可以在不使用数组的情况下使用O(1)搜索实现数据结构?

Data structures 是否可以在不使用数组的情况下使用O(1)搜索实现数据结构?,data-structures,theory,performance,Data Structures,Theory,Performance,我目前正在上大学的数据结构课程,这个话题困扰了我一段时间(这不是家庭作业,只是一个纯粹的理论问题) 假设您想要实现一个字典。当然,字典应该有一个搜索功能,接受一个键并返回一个值 现在,我只能想象实现这一目标的两种非常普遍的方法: 使用某种搜索树,它(总是?)会给出一个O(logn)最坏情况下的运行时间,以便通过键查找值,或者 对键进行散列,该键本质上返回一个自然数,该自然数对应于值数组中的一个索引,给出了O(1)最坏情况下的运行时间 O(1)最坏情况下搜索函数是否可以在不使用数组的情况下运行

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

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

现在,我只能想象实现这一目标的两种非常普遍的方法:

  • 使用某种搜索树,它(总是?)会给出一个O(logn)最坏情况下的运行时间,以便通过键查找值,或者
  • 对键进行散列,该键本质上返回一个自然数,该自然数对应于值数组中的一个索引,给出了O(1)最坏情况下的运行时间
O(1)最坏情况下搜索函数是否可以在不使用数组的情况下运行时间

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

在做出一些特定的假设时,例如,键的顺序是否可能


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

不是使用数组进行O(1)查找,事实上,查找时间并不取决于数据存储的大小。因此,任何直接访问数据的方法,如果没有以某种方式与数据存储空间大小成比例的搜索,都将是O(1)。

您可以使用trie树实现哈希。复杂性是O(max(length(string))),如果您有大小有限的字符串,那么可以说它在O(1)中运行,它不取决于结构中的字符串数量

从本质上讲,算法是通过处理一定数量的信息位来达到其结果的。他们所花的时间取决于他们能以多快的速度做到这一点

只有两个分支的决策点不能处理超过1位的信息。然而,具有n个分支的决策点最多可以处理日志(n)位(基2)


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

如果有完美的哈希,在最坏的情况下,哈希表仅为O(1)。实际上,哈希表在平均情况下是O(1),在最坏情况下通常是O(n)。有趣的见解。我不太熟悉哈希表是如何实现的,它们通常不是像我建议的第二种方法那样实现的吗?是的,但是在实际的用例中,您需要考虑哈希冲突。有一个简单的概述可以让您开始。考虑哈希冲突意味着每个表项都可能包含多个值,因此它必须有一个数组。根据您对“无数组”要求的严格解释,这可能意味着此问题不允许使用哈希表解决方案。@Sherm:表项可以使用链表,更具体地说,“无数组”意味着没有可以像问题中的第二种方法那样使用的数组-防止使用数组进行随机访问。例如,当访问数组中的第i项或查找某些堆/树的最小值/最大值时,这是正确的。我想知道对于包含N个元素的集合是否可能。@GeReV,我不太确定你在问什么。一个数组有N个元素。我想问的是,例如,是否有一些搜索树、堆等的实现,它们不使用数组作为底层实现,但仍然保留O(1)个搜索运行时间。@GeReV,树本身就有根和分支,这取决于树的平衡方式,通常从根开始按指数级扩展。因此,如果我们通过根访问一棵树,我们将始终具有θ(logn)平均运行时间。这仅仅是因为访问的节点数与log n成正比。所以答案是否定的,没有O(1)树实现。我将尝试以不同的方式解释我的问题。问题并不是专门针对树、向量等。我声称访问内存中随机项的唯一方法只能通过数组(即可预测的内存地址)实现,并询问该说法是否属实。如果这不是真的,是否可能存在某种复杂的数据结构,可以访问其任何元素而不依赖于元素的数量,也不需要像哈希表那样将密钥转换为内存地址?是的,但最小密钥大小仍然与log n成正比。随着n的增加,键也会增加。因此,这仍然是一个O(logn)结构。@ThomasMcLeod,虽然你在理论上是对的,但这基本上是一个B树,就像一个数据库。有少量的挥手,你可以考虑它的线性时间查找。例如,如果我们允许“字符串”具有一个字节的整个值范围,那么长度为5的话,就有超过一万亿个可能的值。虽然技术上是O(log n),但实际上N很小,你可以认为它是恒定的。谢谢,这是一个很好的答案!