嵌套循环的大O(int j = 0; j <i; j ++)

时间:2020-01-02 23:49:18

标签: big-o

for (int i = n; i > 0; i /= 2) {
   for (int j = 0; j < i; j++) {
     //statement
   }
}
Answer: O(N)

我知道for (int i = n; i > 0; i /= 2)的第一个循环会产生O(log N)

第二个循环for (int j = 0; j < i; j++)依赖于i,并且将首先循环i次,然后再进行i / 2i / 4等次循环。 (其中i取决于n

我不知道第二个循环的大O,但是我认为答案是O(log N * something),其中O(log N)是外部循环,something是内部循环?

您如何获得O(N)

1 个答案:

答案 0 :(得分:2)

由于O(log n),外部循环的复杂度为i /= 2。但是内循环要复杂一些。

内部循环的复杂度为O(i),但是i随外部循环的每次迭代而变化。结合外循环,您将获得O(n / log n)的复杂性。您将获得以下信息:

内部循环正在执行的步骤数类似于1/(2n)的总和,如https://en.wikipedia.org/wiki/1/2_%2B_1/4_%2B_1/8_%2B_1/16_%2B_⋯所述。首先,您先执行n个步骤,然后再执行n/2个步骤,然后执行n/4个步骤,依此类推,直到您仅执行2个步骤,然后再执行1个步骤。这总和为2n的结果。总的来说,您运行内部循环log n次(由外部循环定义)。这意味着内部循环平均 2n / log n次运行。因此,您的复杂度为O(n / log n)

使用O(log n)的外部循环和O(n / log n)的内部循环,您会得到O(log n * n / log n),可以将其简化为O(n)