Time complexity 简单时间复杂度O(nlogn)

Time complexity 简单时间复杂度O(nlogn),time-complexity,big-o,Time Complexity,Big O,我正在为面试复习一些大O符号,我遇到了这个问题 for i = 1 to n do: j = i while j < n do: j = 2 * j 对于i=1到n do: j=i 而j

我正在为面试复习一些大O符号,我遇到了这个问题

for i = 1 to n do:
    j = i
    while j < n do:
    j = 2 * j
对于i=1到n do:
j=i
而j
简单对吧?外部循环提供n个步骤。每一步我们都做一个赋值的步骤O(1),然后记录(n-j)或记录(n-i),因为while循环的步骤是
j=i
。我以为时间复杂度是O(nlogn),但答案是O(n)

答案如下:

运行时间约为以下总和:∑1+ i从1到n的对数(n/i),即Θ(n)

现在已经有一段时间了,所以我有点生疏了。
日志(n/i)
来自哪里?我知道log(n)-log(I)=log(n/I)
但是我认为我们记录(n-I)而不是记录(n)-log(I)。时间复杂性如何不是O(nlogn)?我肯定我错过了一些简单的东西,但我已经盯着这个看了好几个小时了,我开始失去理智

来源:这是这个问题的来源

编辑:再仔细考虑一下,内部循环的时间复杂度是log(n/i),这是有道理的。因为每个内部循环运行n-i次,但我将每个循环加倍。如果内部循环总是从0开始,我们有log(n),但考虑到不需要循环的循环数,即log(i)。log(n)-log(i)即log(n/i)。

我认为log(n/i)来自内部循环

注意如何
j=i

也就是说,当i=2时(假设n=10)

内环

while j < n do:
    j = 2 * j
而j
将仅从
j=2
运行到
10
,其中j自身乘以2(因此为日志)&快速超出
n=10

因此,内部循环运行
log base 2 n/i次

我在代码中运行了一个简单的i=10&它看起来像线性时间,因为大部分时间内循环只运行一次

示例:当i的值变成这样,如果将其乘以2,则大于或等于n,则不会多次运行内部循环

因此,如果n=10,则在内部循环中从i=n/2(如果i=10/2=5)
开始执行一次,然后j从j=5开始,在循环中执行一次,将其自身乘以2&内部循环条件
,而j
失败


编辑:如果每次j的值都以j=0开始&内部循环从i到n运行

以添加到提供的答案中,那么这将是
O(n.log(n))
,感谢@RSon1234,这正是我想要的!既然你自己找到了答案,请把它作为一个答案贴出来——它可能会在将来帮助其他人。谢谢Sujal。我知道
j=I
和log(n/I)来自内部循环和您在回答中提到的行为数。但是,如果每个内部循环运行n-I次,为什么不应该是log(n-I)。即使我们有log(n/i)为什么运行时o(n)不是log(n/i)看到答案的最后一部分,这段代码对每个j只运行一次执行,它的初始值相当于i/2,只要拿一支笔和纸写下n=10的简单执行,你会看到执行的总步骤大约是16,与n=10差不多,如果是O(n.log(n)),则执行10*3或30次。