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 / 2
,i / 4
等次循环。 (其中i
取决于n
)
我不知道第二个循环的大O,但是我认为答案是O(log N * something)
,其中O(log N)
是外部循环,something
是内部循环?
您如何获得O(N)
?
答案 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)
。