【问题标题】:Time complexity of if-else statements in a for loopfor循环中if-else语句的时间复杂度
【发布时间】:2015-06-12 21:43:02
【问题描述】:

令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 或仅执行 else 的情况,但是有时执行 if 语句和有时执行 else 语句时的一般情况呢

【问题讨论】:

  • 嗯.... 好吗?你有问题吗?
  • 问题是我怎么知道何时使用 if 语句或 else 语句以及何时调用 f(m) 函数
  • 你被分配了这个任务来帮助你学习一些东西。在这里获得此类问题的答案对您没有帮助。

标签: if-statement for-loop time-complexity asymptotic-complexity


【解决方案1】:

我们可以从简单的案例 2 开始。显然,每次我们通过案例 2 的循环时,都会发生以下两种情况之一:

  1. count 增加(需要 O(1) [除了not really,但我们只是说它适用于在固定长度数字(即 32 位整数)上运行的计算机)])
  2. count 设置为 0(这需要 O(1) [再次,值得商榷])并计算 f(count)(这肯定需要恒定时间)

我们循环 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 赋予自己的一个挑战,虽然这可能是一个更好的问题,但我认为它并没有那么糟糕。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多