1

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

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

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

4

2 回答 2

4

几乎你在一个大小为 32 的数组上所做的一切都是O(1). 线性扫描需要 32 次比较,在O(1)

O(1) = 常量操作数。如果数组大小为 32(或任何固定大小),则操作数确实是恒定的(可以这样想:您可以用链式 if 条件而不是循环替换线性扫描:
if (arr[0] < min), if (arr[1] < min) , ... if (arr[31] < min)

令人兴奋的是,对于 size 数组的一般情况,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次数,您的算法对 A 进行排序O(n)- 这是无法完成的,因为基于比较的排序被证明是有Omega(nlogn)问题的

于 2012-08-15T10:20:04.643 回答
1

我不能提供 O(1) 算法,可能是使用最小堆的一种好方法,O(log n)O(1). 小尺寸数组的最小堆足够快,更新的性能可以忽略不计。

于 2012-08-15T10:19:19.213 回答