鉴于以下算法:
Algorithm Find-Max(Array, size)
Max = -INFINITY
for k:= 1 to n do
if(A[k] > Max-sf) Then
Max-sf:=A[k]
end if
问题是变量max更新的平均时间是多少?
我正在练习算法分析,下面是我的想法,但我不确定,所以我想征求意见。
设T(n)为每次调用find-Max时的比较次数,其中size = n。
T(n) = T(n-1) + 1/n
其中1 / n是最大数字在索引n处的概率。因此,
T(n-1) = T(n-2) + 1/(n-1)
T(n-2) = T(n-3) + 1/(n-2)
通过伸缩,
T(n) = 1/n + 1/(n-1)+ 1/(n-2) + .... + 1
,这是谐波系列。因此,变量Max-sf更新的平均时间是log(n))
这就是我证明它的方式。
所以,我想问3个问题: (1)上述证明是否正确? (2)有没有办法获得比较次数的精确值? (3)假设我们使用分而治之的方法,使用类似的思路作为合并排序而不是扫描数组,更新的数量是否仍然相同?
答案 0 :(得分:0)
1)我不确定你的证据,但我发现this one是最正式和最有说服力的证据。
2)确切的比较数似乎是固定的。你总是在循环中做比较。
3)关于分而治之的选项,它不能比最坏情况下的更新数量(n)更好,因为它的行为如下:
T(n) = 2T(n/2) + 1
这导致T(2 ^ n)= 2 * 2 ^ n-1,这意味着Theta(n)复杂度。