这个程序片段的时间复杂度是多少?

时间:2017-04-14 12:45:41

标签: arrays algorithm time-complexity

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)的时间复杂性的部分,因为如果数组包含所有的零,它将被连续调用。

1 个答案:

答案 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)。