counter = 0;
for (i=1; i<=n; i++)
if (a[i] == 1){
counter++;
}
else {
f (counter);
counter = 0;}
}
让A[1, …, n]
为在每个位置存储位(1或0)的数组,f(m)
是时间复杂度为θ(m)
的函数。
然后,这个程序片段的时间复杂度是多少?
我陷入了函数f(0)
的时间复杂性的部分,因为如果数组包含所有的零,它将被连续调用。
答案 0 :(得分:0)
代码总是Theta(N
)。假设f(m)
对某些常数c的成本为cm。真的应该使用两个不同的常数进行上限和下限分析,因为f(m)
是Theta(m
),但分析将或多或少相同。
然后,f
被调用一些值序列x1, x2, x3, ..., xk
,其对应于1的游程长度。调用f的总费用为c*x1 + c*x2 + ... + c*xk = c(x1 + x2 + ... + xk)
。由于(x1 + x2 + ... + xk)
是数组中1的总数,因此该总和最多为N
(数组的长度)。因此,调用f
的总费用将始终为O(N
)。
代码始终循环N
次,因此N
也是总费用的下限。
我们已经显示了线性上限和下限,因此f是Theta(N
)。