【问题标题】:Finding out complexity of a program when we use while loop当我们使用 while 循环时找出程序的复杂性
【发布时间】:2020-04-13 20:42:08
【问题描述】:

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

int fun1(int n) {
  int i = 1;
  int count = 0;

  while (i < n) {
    count++;
    i = i * 2;
  }

  printf("Loop ran %d times\n", count);

  return 0;
}

【问题讨论】:

  • 它的 log n (base 2)
  • @Eraklon 你能帮我解释一下吗,这会很有帮助
  • i 本质上是 2^count 在迭代的和。如果n 将是 1024,那么在 10 次迭代之后,i 也将是 1024,因此循环将退出。 log2(1024) = 10.

标签: c data-structures time-complexity


【解决方案1】:

所有句子都是 O(1),并且循环执行 log(n)(以 2 为底)迭代,因为 i 每次迭代都将自身(i=i*2)翻倍,因此它的 log(n)(以 2 为底)。

你可以在这里What is time complexity of while loops?找到更多信息。

【讨论】:

    【解决方案2】:

    以上代码的时间复杂度为:O(log(n))

    int fun1(int n) {
      int i = 1;
      int count = 0;
    
      // Here i runs from 1 to n 
      // but i doubles every time
      // i = 1 2 4 8 16 .... n
      // Hence O(log(n))
      while (i < n) {
        count++;
        i = i * 2;
      }
    
      printf("Loop ran %d times\n", count);
    
      return 0;
    }
    

    假设n = 16 == 2^4

    在这种情况下,循环将只运行 4 次 == 1 2 4 8 == log(16)

    【讨论】:

      【解决方案3】:

      看看你的这部分代码:

        while (i < n) {
          count++;
          i = i * 2;
        }
      

      i 在每次迭代中乘以 2

      最初,i1
      迭代我:
      i = 1 * 2; => i = 2
      迭代二:
      i = 2 * 2; => i = 4
      迭代三:
      i = 4 * 2; => i = 8
      迭代四:
      i = 8 * 2; => i = 16
      .....
      .....
      等等..

      假设 n 是一个等于 2k 的数字。这意味着,循环将执行k 次。在k步:

      2k = n

      两边取对数(以2为底):

      log(2k) = log(n)

      k log(2) = log(n)

      k = log(n) [as log2(base 2) = 1]

      因此,时间复杂度为 O(log(n))。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-02
        • 1970-01-01
        • 2013-12-08
        • 2016-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多