【问题标题】:Time complexity of nested while loop嵌套while循环的时间复杂度
【发布时间】:2017-02-27 08:08:40
【问题描述】:

我不知道如何在这个语句中确定 while 循环的时间复杂度:

procedure P (integer n);
 for (i: 1 to n)
   x := n;
   while (x > 0)
         x := x - i;

我知道 for 循环运行 (n-1) 次。起初我以为 while 循环会运行 n 次,因为我把 i 误认为是 1,但事实并非如此。我一直在输入数字以查看程序何时停止,但没有看到一致的模式。我注意到随着 n 的增加,while 循环运行的时间更长(但不是很多),所以这可能有点对数吗?提前致谢。

【问题讨论】:

    标签: algorithm loops time-complexity big-o


    【解决方案1】:

    MBo 的答案非常详细。 如果到目前为止,您可能会问自己,为什么第一次运行有 n 个 while-cycles,第二次运行 n/2 个 while-cycles,等等。

         x := n;
         while (x > 0)
             x := x - i;
    

    根据 while 循环的条件,所有循环都会运行到 x==0

    因此,第一个 while 循环运行:n-t*1=0 次整数 ti==1

    第二次 while 循环运行:n-t*2=0 某个整数 ti==1 的次数

    所以我们得到第一个n=t 第二个n=2tso n/2=t 第三个n/3=t

    【讨论】:

      【解决方案2】:

      第一次运行产生 n 个 while 循环
      第二次运行产生 n/2 个 while 循环
      第三次运行产生 n/3 个循环
      第 k 次运行产生 n/k 而循环

      所以总时间与

      成正比
      n * (1/1 + 1/2 + 1/3 +...+1/n)
      

      在括号中我们可以看到harmonic series的部分和,它倾向于n的自然对数,复杂度是O(n log n)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-18
        相关资源
        最近更新 更多