我知道哪些订单数据的数据结构充其量只能进行O(log n)查找。
我认为要找到小于给定值的最大值,我们需要首先发现给定值在数据结构中的位置。 (我没有证据证明这是必需的第一步)。
这需要O(log n)时间。
从那里,我们需要找到小于该值的最大值。在数组的情况下,我们看一个索引回O(1)。在平衡树的情况下,我们遍历通常为O(log n)的路径。
无论如何,似乎平均总时间复杂度必须为O(log n)。
这是正确的,还是我们能以某种方式做得更好?
答案 0 :(得分:2)
如果您的值被限制在合理的范围内,并且首先构建数据结构的复杂性没有限制,您可以使用经典的时间/空间权衡在O(1)中进行。 / p>
只需将数组保持足够大以容纳所有可能的输入值。使用表示没有有效最大值的值对其进行初始化。要插入新值,请使用数字填充上面的 该数字,直到找到已包含不同最大值的元素。完成后,获取最大值就像获取数组索引处的值一样简单。
在Python中,任何值0
到n_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
时才有意义。对于特定的大小,恒定因子可能更重要。