【问题标题】:What is the time complexity for finding the maximum value less than a given value?找到小于给定值的最大值的时间复杂度是多少?
【发布时间】:2016-02-01 18:17:44
【问题描述】:

我所知道的对数据排序的任何数据结构,最多只能进行 O(log n) 查找。

我认为要找到小于给定值的最大值,我们需要首先发现给定值在数据结构中的位置。 (我没有证据表明这是必需的第一步)。

这需要 O(log n) 时间。

从那里,我们需要找到小于该值的最大值。在数组的情况下,我们回顾一个索引 O(1)。在平衡树的情况下,我们遍历通常为 O(log n) 的路径。

无论如何,似乎平均总时间复杂度必须是 O(log n)。

这是正确的,还是我们可以做得更好?

【问题讨论】:

  • 我认为是典型的二分查找问题,所以O(logn)
  • 值是什么?我们可以假设它们在有限的范围内吗?您是否允许执行预计算(仅当您执行许多此类查询时才有意义)?第二个问题也毫无意义——你总是可以做得更糟:)
  • @IvayloStrandjev 摆脱了最糟糕的部分。
  • @z5h 实际上这是我评论中最重要的部分,只是一种戏弄。你能回答问题吗?
  • 可以想象一个数据结构,它对特定值进行 O(1) 查找和 O(log(n)) 搜索 - 例如组合的 hashmap / 树。然后,您可以对最大值进行推测性查找。如果幸运的话,您可以在 O(1) 中完成整个搜索(最好的情况)。

标签: algorithm time-complexity


【解决方案1】:

如果您的值被限制在一个合理的范围内,并且对构建数据结构的复杂性没有限制,您可以使用经典的时间/空间权衡在 O(1) 内完成。

只需为所有可能的输入值保持足够大的数组即​​可。用一个表明没有有效最大值的值对其进行初始化。要插入一个新值,请用该数字填充该数字的每个数组元素,直到您到达一个已经包含不同最大值的元素。完成后,获取最大值就像获取数组索引处的值一样简单。

在 Python 中,对于任何值 0n_max

array = [None] * (n_max + 1)
for n in values:
    for i in range(n + 1, n_max + 1):
        if array[i] == i - 1: break
        array[i] = n

for n in lookups:
    print array[n]

【讨论】:

    【解决方案2】:

    不,没有更有效的基于比较的算法。最坏的情况确实受到Omega(logn) 使用基于比较的算法的限制,因为有n 可能的输出(所有这些都可以通过正确的查询来实现),并且要选择其中一个,计算树的高度必须为@987654323 @。无论使用何种数据结构,这为我们提供了使用比较来解决此问题的Omega(logn) 的下限。

    这个界限显然很紧,因为在一个排序数组中,可以在O(logn) 中使用二分搜索找到所需的值。

    【讨论】:

      【解决方案3】:

      为了快速回答,是的,它必须是 O(logn),因为您需要数据的顺序才能将您的值与数据进行比较,并看到确实没有什么比答案更接近和低于您的值了.

      【讨论】:

        【解决方案4】:

        回答一个更实际的问题:为有序数组中的每个 x 找到小于 x 的最大值

        假设最大值集合的大小为 n,要查找的 x 数组的大小为 m

        分别优化每个子问题,即迭代 x O(m) 次搜索值 O(logn),你能做的最好的就是 O(m*logn)

        但是这个实际问题可以在O(m+n) 中解决 - 如果两个数组都已经排序,只需同时迭代两个数组即可。显然只有在m > n 和常数因素可能更重要的情况下才有意义特定尺寸。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-16
          • 1970-01-01
          相关资源
          最近更新 更多