If statement for循环中if-else语句的时间复杂度

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

设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<=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中,每次我们通过循环时,都会发生以下两种情况之一:

  • 计数是递增的(这需要O(1)[除了,但我们只是说它适用于操作固定长度数字(即32位整数)的计算机])
  • count设置为0(这需要O(1)[同样,有争议])并计算f(count)(这肯定需要恒定的时间)
  • 我们循环n次,每次都需要O(1)次,bada bing,bada boom,需要O(n)(或者O(n*lg(n)),如果你是学究,使用可变长度整数)

    另一方面,案例1需要一点数学思考

    情况1中占用最短时间的位字符串显然是
    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)函数,你被分配这个任务是为了帮助你学习一些东西。在这里得到这类问题的答案对你没有帮助。