If statement for循环中if-else语句的时间复杂度
设A[1,…,n]是在每个位置存储位(1或0)的数组,f(m)是时间复杂度为θ(m)的函数。考虑以下C语言编写的程序片段: 案例1:-If statement for循环中if-else语句的时间复杂度,if-statement,for-loop,time-complexity,asymptotic-complexity,If Statement,For Loop,Time Complexity,Asymptotic Complexity,设A[1,…,n]是在每个位置存储位(1或0)的数组,f(m)是时间复杂度为θ(m)的函数。考虑以下C语言编写的程序片段: 案例1:- counter = 0; for (i = 1; i < = n; i++) { if (A[i] == 1) counter++; else { f(counter); counter = 0; } } 计数器=0; 对于(i=1;i
counter = 0;
for (i = 1; i < = n; i++)
{
if (A[i] == 1)
counter++;
else {
f(counter);
counter = 0;
}
}
计数器=0;
对于(i=1;i<=n;i++)
{
如果(A[i]==1)
计数器++;
否则{
f(柜台);
计数器=0;
}
}
案例2:-
counter = 0;
for (i = 1; i < = n; i++)
{
if (A[i] == 1)
counter++;
else {
counter = 0;
f(counter);
}
}
计数器=0;
对于(i=1;i<=n;i++)
{
如果(A[i]==1)
计数器++;
否则{
计数器=0;
f(柜台);
}
}
这个程序片段的复杂性是
(A) Ω(n2)
(B) Ω(nlog n)和O(n2)
(C) θ(n)
(D) O(n)
问题是我如何知道何时使用if语句或else语句,何时调用f(m)函数,我如何处理它?当只有执行或只执行时,我可以考虑这些情况,但是一般情况下,如果有时执行语句,而语句有时 < P >,我们可以从简单的情况开始,案例2。显然,在案例2中,每次我们通过循环时,都会发生以下两种情况之一:
11111…11111
,000…000
,000…0111…111
,或类似的字符串。所有这些都需要θ(n)时间来完成,从而为情况1建立了一个下限。现在,我们需要建立一个最坏的情况
在不进行严格的证明的情况下,断言最坏情况下的位字符串如下所示非常简单:
111....1110
上述形式的长度为100的位字符串将有99个1,因此需要99+99
时间单位才能完成。长度为n的字符串显然需要2(n-1)
时间单位才能完成
这显然在n中仍然是线性的,因此情况1,即使在最坏的情况下,也是θ(n)
因为案例1和案例2都是θ(n),所以问题是θ(n)
如果您仍然需要确信<代码> 11…110 是最坏情况位串,请考虑如下:
A bit string of the form
|--------------n bits------------|
1....101....101....10......1....10
|-L1-| |-L2-| |-L3-| |-Lm-|
11110
Where L1 - Lm are arbitrary integers will require time
t = (L1) + (L2) + (L3) + ... + (Lm) + (n - m)
= sum(L1 to Lm) - m + n
the more "runs" of ones there are, the larger the - m factor is. If we
just have one big "run" of ones, we have
t = n - 1 + n - 1 = 2(n - 1)
作为一名教师,我不会回答关于stackoverflow的糟糕的家庭作业问题
然而,在聊天中与coder101交谈后,他/她告诉我这不是家庭作业问题,而是从在线数据库检索的问题,该数据库旨在提供“极客模拟测试”。这看起来像是coder101给他们自己的一个挑战,虽然这可能是一个更好的问题,但我不认为它有那么糟糕。嗯。。。。好啊你有问题吗?问题是我如何知道何时使用if语句或else语句,何时调用f(m)函数,你被分配这个任务是为了帮助你学习一些东西。在这里得到这类问题的答案对你没有帮助。