我有一个32位数组的数组。最初,每个数字都是0,但它可能并不重要。O(1)最小在一个固定大小的数组中变化
在任何时候我可以改变这个数组中的一个数字。
我想快速找到这样的更新后的最小值及其索引。有没有办法在O(1)时间做到这一点?
我有一个32位数组的数组。最初,每个数字都是0,但它可能并不重要。O(1)最小在一个固定大小的数组中变化
在任何时候我可以改变这个数组中的一个数字。
我想快速找到这样的更新后的最小值及其索引。有没有办法在O(1)时间做到这一点?
几乎你在32号数组上做的所有事情都是O(1)
。线性扫描需要32个比较,这是在O(1)
O(1)=常数ops。如果数组的大小为32(或者对于这个问题有任何固定的大小),ops的数量确实是不变的(想想这样:你可以用一个链条代替线性扫描来取代线性扫描: 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)
- 这不能做,因为基于排序comparations被证明是Omega(nlogn)
问题
我不能提供一个O(1)算法,可能是一个很好的方法是使用最小堆,在O(log n)
中做更新,并在O(1)
中找到最小值。对于小尺寸阵列,最小堆速度足够快,并且在更新中的性能可以忽略不计。
是的,这将是我的最后手段 – user16367 2012-08-15 10:20:53
我怀疑如果在输入没有限制的情况下可以找到更好的选项,还要注意'log n'太小而且比太多具有大常数因子的线性算法。 – 2012-08-15 10:22:46
您可以登录你同时想什么,当你在阵列中更改数字? – irrelephant 2012-08-15 10:03:19
几乎你在32位数组上做的每件事都是'O(1)'。线性扫描需要32个比较,它在'O(1)' – amit 2012-08-15 10:04:37
@amit中。在决定算法是否为O(1)时,数组的大小并不重要。对具有32个值的数组进行线性扫描不是O(1)。 – user16367 2012-08-15 10:11:44