简单的时间复杂度O(nlogn)

时间:2017-10-07 04:32:33

标签: time-complexity big-o

我正在审查一些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)。

1 个答案:

答案 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