Algorithm 以下代码片段的时间复杂度是多少?

Algorithm 以下代码片段的时间复杂度是多少?,algorithm,asymptotic-complexity,Algorithm,Asymptotic Complexity,设A[1,…n]是在每个位置存储位(1或0)的数组,f(m)是时间复杂度为Θ(m)的函数。考虑以下C语言编写的程序片段: counter = 0; for (i=1; i<=n; i++) { if a[i] == 1) counter++; else {f (counter); counter = 0;} } 计数器=0; 对于(i=1;i传递给f的所有计数器的总和最多为n,因此调用f的总成本为O(n)。这是因为f(m)具有时间复杂度θ(m),这意味着对于某些c,调用f的成本f(m)

设A[1,…n]是在每个位置存储位(1或0)的数组,f(m)是时间复杂度为Θ(m)的函数。考虑以下C语言编写的程序片段:

counter = 0;
for (i=1; i<=n; i++)
{ if a[i] == 1) counter++;
else {f (counter); counter = 0;}
}
计数器=0;

对于(i=1;i传递给f的所有计数器的总和最多为n,因此调用f的总成本为O(n)。这是因为f(m)具有时间复杂度θ(m),这意味着对于某些c,调用f的成本f(m)
循环中每次都要做一些功,所以总成本也以n的倍数为界。因此总成本是θ(n)。

f(m)是一个时间复杂度为Θ(m)
的函数,所以在最坏的情况下,代码有O(n^2)复杂性。请缩进您的代码以确保可读性。@TarwirdurTuron它不是那么简单,因为
n
不是函数
f
的输入。特别是,调用
f
的频率越高,对
f
的平均输入就越小。请澄清,您说代码是O(n^2)并没有错,这确实是一个上界。但是你可以得到一个更紧的上界。不,计数器在每次调用f后都重置为0,因此你有n次调用f(0),这具有线性复杂性。下选程序能解释一下吗?是因为他们认为答案是O(n^2)?如果您指出
f
的线性运行时间允许您使用输入到
f
的总和来绑定运行
f
所花费的总时间,则可能会减少混淆。如果
f
具有非线性复杂性(例如θ(logn)或θ(n^2))如果不做一些修改,这个论点就行不通了。我理解上限部分,但我无法得到下限部分,比如说我有一半的值是0,一半是1,你考虑过下限ω(n)吗对于所有位都为1的情况,使用相同的参数作为下限。只需切换不等式。您可以忽略f来计算下限:每次通过循环,如果执行[i]==1
,则语句
,即O(1)。因此代码至少具有线性运行时。