具有特殊内循环的大 O 表示法

Big O notation with special inner loop

我想在分析以下大 O 符号方面得到一些帮助。

案例A: 内循环在最坏的情况下只运行一次

    for (int i = 0; i < nums.length; i++) {

       if (i==nums.length-1 && nums[i] == 3){
          for (int j = 0; j < nums.length; j++) {
           print();
          }
       }
    }

最坏的情况是数组以 3 结束。这是 O(N) 还是 O(N*N)?

我是这样分析的:

所以,n*1 = O(n),我可以分析吗?

“n*1”有意义还是应该是“n+1”?

案例B:

内循环总是运行,除非 i 是第一个元素

   for (int i = 0; i < nums.length; i++) {
     if (i!=0){
        for (int j = 0; j < nums.length; j++) {
          print();
        }
     }
   }

我的分析方法如下:

所以,n*(n-1) = O(n*n),我可以分析吗?

我对那些案例很困惑,谢谢!

案例A:

The outer array runs N times= 1(n)
The inner loop in the worst case runs just 1 time = 1

我认为你在这里的推理可能没问题,但正如它所写的那样,这不可能是正确的。 The outer array runs N times 意味着你计算 1 循环的每次迭代,但 The inner loop in the worst case runs just 1 time 不可能是正确的(在相同的定义下),因为它将有 n 迭代作为好吧(在最坏的情况下,即如果最后一个元素是 3)。我认为您在第一行使用了 runs = number of iterations,在第二行使用了 runs = starts/finishes;两者都没有问题,但请确保清晰一致。

你说得对 The worst case scenario is an array that finish in 3,在这种情况下它运行外循环 n 次(跳过内循环)然后在最后一次迭代中它不会跳过内部循环,运行 n 次。这是 O(n+n) = O(n).


另一种思考方式是代码可以重写为:

for (int i = 0; i < nums.length; i++) {
}

if ((nums.length > 0) && (nums[nums.length-1] == 3)){
    for (int j = 0; j < nums.length; j++) {
        print();
    }
}

我们为最坏的情况重写如下:

for (int i = 0; i < nums.length; i++) {
}

for (int j = 0; j < nums.length; j++) {
        print();
}

那么它的连续性就很明显了:n + n 工作。这里重要的是我们没有以任何重要的方式改变算法(我们没有影响最坏情况的复杂性)。

案例 B:

你的逻辑和数学看起来不错。