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(log N * something)
,其中 O(log N)
是外层循环的时间复杂度,something
是内层循环的时间复杂度?那么怎么才能得到
O(N)
的时间复杂度呢?
O(n)
,外部循环是O(log N)
? - csguyO(i)
,但i
从外部改变。与外部循环结合起来,内部循环看起来像O(N / log N)
。将其乘以外部的O(log N)
,你会得到O(N)
,与给定答案相同。 - Progmani
=n / log n
的原理吗? - csguyn
。第一次迭代是n
步,最后一次迭代是1步。通过https://en.wikipedia.org/wiki/1/2_%2B_1/4_%2B_1/8_%2B_1/16_%2B_⋯ 的帮助,您可以得到O(n / log n)
。 - Progman