我正在审查一些Big O表示法,我遇到了这个问题。
for i = 1 to n do:
j = i
while j < n do:
j = 2 * j
简单吧?外循环提供n个步骤。并且每个步骤我们执行赋值j=i
的单步O(1),然后log {n-j)或log(n-i),因为j = i
步骤为while循环。我认为时间复杂度是O(nlogn),但答案是O(n)。
这是答案:
运行时间大约是以下总和:Σ1+ i的log(n / 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)。
答案 0 :(得分:0)
我认为log(n / i)来自内循环
注意j = i
这意味着当i = 2(假设n = 10)时
内环
while j < n do:
j = 2 * j
将仅从j=2
运行到10
,其中j将自身多次传输2(因此日志)&amp;迅速超过n=10
所以内循环运行log base 2 n/i times
我通过代码&amp;运行了一个简单的i = 10它看起来像线性时间,因为大部分时间内循环只运行一次。
示例:当i的值变为这样,如果你将它乘以2,你得到大于或等于n,你就不会多次运行内循环。
所以如果n = 10,你会在内部循环中从i=n/2 (if i=10/2=5)
开始执行一次,然后j从j = 5开始,一旦将自身与2&amp;内循环条件while j < n do:
失败。
编辑:如果j的值以j = 0开始,那么它将是O(n.log(n))
每次&amp;内循环从i到n