在变化的固定大小数组中最小为O(1)

时间:2012-08-15 10:02:02

标签: algorithm math

我有一个包含32个数字的数组。最初,每个数字都是0,尽管它可能并不重要。

我可以随时更改此数组中的一个数字。

我想在这样的更新后快速找到最小值及其索引。有没有办法在O(1)时间内完成?

2 个答案:

答案 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)中找到最小值。小型阵列的最小堆足够快,并且您在更新时的性能可以忽略不计。