找到小于给定值的最大值的时间复杂度是多少?

时间:2015-08-19 15:44:34

标签: algorithm time-complexity

我知道哪些订单数据的数据结构充其量只能进行O(log n)查找。

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

这需要O(log n)时间。

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

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

这是正确的,还是我们能以某种方式做得更好?

4 个答案:

答案 0 :(得分:2)

如果您的值被限制在合理的范围内,并且首先构建数据结构的复杂性没有限制,您可以使用经典的时间/空间权衡在O(1)中进行。 / p>

只需将数组保持足够大以容纳所有可能的输入值。使用表示没有有效最大值的值对其进行初始化。要插入新值,请使用数字填充上面的 该数字,直到找到已包含不同最大值的元素。完成后,获取最大值就像获取数组索引处的值一样简单。

在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]

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

要快速回答,是的,它必须是O(logn),因为您需要数据的顺序才能将您的值与数据进行比较,并且确实没有其他任何东西比您的价值更接近和低于您的价值

答案 3 :(得分:0)

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

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

分别优化每个子问题,即迭代x O(m)次搜索值O(logn),您可以做的最好的事情是O(m*logn)

但是这个实际问题可以在O(m+n)中解决 - 如果两个数组都已经排序,那么它只是同时迭代两个数组的问题。显然只有在m > n时才有意义。对于特定的大小,恒定因子可能更重要。