我在回顾一些面试的大O表示法,并且遇到了这个问题。简单的时间复杂度O(nlogn)
for i = 1 to n do:
j = i
while j < n do:
j = 2 * j
简单吧?外循环提供了n个步骤。并且这些步骤中的每一个我们执行分配j=i
的单个步骤O(1),然后从j = i
步进while循环的log(n-j)或log(n-i)。我认为时间复杂度是O(nlogn),但答案是O(n)。
这里是答案:
的运行时间大约是以下之和:Σ 1 + 日志(N/I),其中i从1到n,其是Θ(n)中。
现在它已经有一段时间了,所以我有点生疏。 log(n/i)
从哪里来?我知道log(n) - log(i) = log(n/i)
但是我认为我们记录(n-i)不是log(n) - log(i)。时间复杂度不是O(nlogn)?我相信我错过了一些简单的东西,但我现在已经盯着这个小时了,现在我开始失去理智了。
来源:这里是源这个问题Berkeley CS 170, Fall 2009, HW 1
编辑:经过考虑之后多一点是非常有意义的内部循环的时间复杂度是log(N/I)。导致每个内部循环运行n-i次,但是我将每个循环加倍。如果内部循环总是从0开始,我们有log(n),但是要考虑循环的数量,我们不必循环log(i)。 log(n) - log(i)是log(n/i)。
要添加到所提供的答案[见这里](HTTPS://数学。stackexchange.com/questions/74412/how-to-show-sum-limits-i-1n-log-left-fracni-right-thetan)这个数字如何是O(n) – RSon1234
谢谢@ RSon1234这正是我所知寻找! –