Java 中以下最小和最大递归代码的大 O 表示法

Big O notation of the following min and max recursive code in Java

所以 n 是数组 a 的长度,p 是 int 个 len 2.both 元素的数组 p 中的元素为零。第一次调用是 findbigO(a, n-1, p).

findbigO(int[] a, int i, int[] p)
if (i == 0) {
   p[0] = a[0];
   p[1] = a[0];
} else {
   findbigO(a, i‐1, p);
   if (a[i] < p[0]]) {
      p[0] = a[i];
   }
   if (a[i] > p[1]]) {
      p[1] = a[i];
   }
}

代码基本上是在一个数组中找到最大值和最小值,并将它们存储在不同的数组 P 中。我试图找出这段代码的大 O。我认为它是 n 的大 O,因为递归根据数组的长度被调用 n 次。大家怎么看

好吧,根据定义,第一次调用中的 in-1,即与 n 大小相同。因此,对于 big-O-over-n 表示法,初始 i 可以被视为 n.

除了递归调用之外,代码本身是恒定时间:此代码的执行次数不会受到任何影响。

递归调用必然会向结束条件前进(i == 0,当没有递归发生时),并且在 O(n) 时间内完成:事实上,恰好在 n 步之后,0 将已达到。

因此,我们有一个 O(1) 'loop' 被执行 O(i-initial) 次,其中 i-initialn 的大小相同,合并为 O(1) * O(n) 就是 O(n).

为了帮助您确认大 O 符号,这里是大 O 的 'point':

制作二维线图。在 x 轴上,输入 'n'。在 y 轴上,输入 'time taken by the CPU'.

然后填写这张图表。起初它会很混乱(也许在其中一个运行中,您的 winamp 切换歌曲或诸如此类),但是向右走得足够远,输入的算法复杂性将开始成为决定因素。它'balances out',换句话说,变成了一个可识别的图形。该图是什么样的?

对于这个算法,一条直线,不是水平的。换句话说,它看起来像 y = C*x,其中 C 是某个常数。这就是 O(n) 的意思:该图最终会稳定下来,看起来像 y = C*x 那样,对于某些 C.

O(n^2) 表示:图形最终稳定为看起来像 y = x^2 的东西。这也是为什么 O(x^2 + x) 不是一个东西,因为 y = x^2 + x,一旦你向右走得足够远,看起来就像 y = x^2 在它的右侧。

findbigO(n) = findbigO(n-1) + (1)

findbigO(n) = (findbigO(n-2) + O(1)) + (1)

...

findbigO(n) = findbigO(n-n) + n*O(1)

findbigO(n) = findbigO(0) + n*O(1)

findbigO(n) = O(1) + n*O(1)

findbigO(n) = O(1) + n*O(1)

findbigO(n) = O(1) + O(n)

findbigO(n) <= O(n) + O(n)

findbigO(n) <= 2*O(n)

O(n) 中的 findbigO