我有一个包含32个数字的数组。最初,每个数字都是0,尽管它可能并不重要。
我可以随时更改此数组中的一个数字。
我想在这样的更新后快速找到最小值及其索引。有没有办法在O(1)时间内完成?
答案 0 :(得分:4)
你在32号数组上做的几乎所有事情都是O(1)
。线性扫描需要进行32次比较,即O(1)
O(1)=操作的常数。如果数组的大小为32(或任何固定大小),那么ops的数量确实是恒定的(可以这样想:你可以用链接替换线性扫描if条件而不是循环:
if (arr[0] < min), if (arr[1] < min) , ... if (arr[31] < min)
令人兴奋的是,对于大小为n
的数组的一般情况,基于比较的算法是不可能的。
如果是,我们可以使用基于比较的算法对O(n)
进行排序:
given an array A:
max <- max(A)
build an empty data structure as desired let it be `S`.
for each element of A - insert it into S in a different index.
while (S.min() <= max):
idx <- S.findminIndex()
print S.min()
S.update(idx,max+1)
假设上述算法中的每个操作都是O(1)
,并且循环迭代n
次,您的算法会对O(n)
中的A进行排序 - 这是无法完成的,因为基于比较的排序已被证明是Omega(nlogn)
问题
答案 1 :(得分:1)
我不能提供O(1)算法,可能是使用min heap的一个好方法,在O(log n)
中进行更新并在O(1)
中找到最小值。小型阵列的最小堆足够快,并且您在更新时的性能可以忽略不计。