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

时间:2015-06-12 21:43:03

标签: 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;
  }
}

案例2: -

counter = 0;
for (i = 1; i < = n; i++)
{ 
  if (A[i] == 1) 
     counter++;
  else {
     counter = 0;
     f(counter); 
  }
}

该程序片段的复杂性是

(A)Ω(n2)

(B)Ω(nlog n)和O(n2)

(C)θ(n)

(D)O(n)

问题是我怎么知道当使用if语句或else语句以及何时调用f(m)函数时,我如何处理它?我可以考虑仅在执行时或仅在其他情况下执行的情况,但有时候if语句执行时会发生什么情况,有时会声明

1 个答案:

答案 0 :(得分:2)

我们可以从简单的案例开始,案例2.显然,每次我们在案例2中完成循环时,会发生以下两种情况之一:

  1. count递增(取O {1)[除not really除外,但我们只是说它适用于以固定长度数字运行的计算机(即32位整数)])
  2. count设置为0(需要O(1)[再次,有争议])和f(计数)被评估(绝对需要恒定时间)
  3. 我们经历了n次循环,每次需要几乎O(1)时间,bada-bing,bada-boom,如果你是O(n)(或O(n * lg(n))迂腐并使用可变长度整数。)

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

    在案例1中花费最短时间的位字符串显然是11111....11111000....000000...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)
    

    作为matter of principle,我不会回答关于stackoverflow的问题不好的问题。

    然而,在与聊天中的coder101交谈后,他/她告诉我这是一个家庭作业问题,而是从在线数据库here中检索到的问题,这意味着提供“极客的模拟测试”。这似乎是coder101赋予自己的挑战,虽然这可能是一个更好的问题,但我认为这不是那么糟糕。