我相信该算法可以在O(n ^ 3)的时间内运行。对吗?

时间:2018-07-08 18:07:46

标签: algorithm big-o

我的推理:一个简单的1递减循环将在O(n)时间内运行。但是,此算法对参数n进行三重嵌套传递,以将所有三个变量递减为零。 n * n * n = n ^ 3。

public static void downByThree (int n) {
   int x = n;
   while (x > 0) {
       int y = n;
       while (y > 0) {
           int z = n;
           while (z > 0) {
               z--;
           }
           y--;
        }
        x--;
     }
   }

3 个答案:

答案 0 :(得分:2)

此循环

int a = n;
while (a > 0) {
    <body>
    a--;
}

是使用while循环实现重复执行的概念的示例,假设<body>不修改a。用伪代码看起来像这样:

REPEAT n TIMES
    <body>

因此,您的代码具有以下伪代码结构:

REPEAT n TIMES
    REPEAT n TIMES
        REPEAT n TIMES
            <no-op>

虽然编译器可能会发现代码是<no-op>的n 3 重复并对其进行优化,但算法的O(n 3 )结构。

答案 1 :(得分:1)

是的,正如您提到的,这在O(n ^ 3)中。您的推理是正确的,您使Z循环为O(n),然后使y循环为O(n ^ 2)和最后一个O(n ^ 3)。

答案 2 :(得分:1)

您相信100%正确。是的,以上算法的运行时间为O(n ^ 3)。
基本上,以上代码等效于:

 for(int x = n; x>0 ; --x){
    for(int y = n; y>0 ; --y){
        for(int z = n; z>0 ; --z){

        }
     }
  }

正如我们看到的,有3个嵌套的for循环长度恰好为 n ,我们可以得出时间复杂度为O(n ^ 3)。
更明确地说, z 变量每 n < em> y 变量[O(n * n)],并且每 x 次,该现象发生 n 次变量。因此,总体时间复杂度将为 O(n ^ 3)