Big o 嵌套循环的大O(int j=0;j<;i;j+;+;) for(int i=n;i>0;i/=2){ 对于(int j=0;j0;I/=2)的第一个循环导致O(logn)

Big o 嵌套循环的大O(int j=0;j<;i;j+;+;) for(int i=n;i>0;i/=2){ 对于(int j=0;j0;I/=2)的第一个循环导致O(logn),big-o,Big O,我知道,for(inti=n;I>0;I/=2)的第一个循环导致O(logn) (int j=0;j

我知道,
for(inti=n;I>0;I/=2)
的第一个循环导致
O(logn)

(int j=0;j的第二个循环
依赖于
i
,将首先迭代
i
次,然后迭代
i/2
i/4
。。。时代。(其中,
i
取决于
n

我不知道第二个循环的大O,但我想答案应该是
O(logn*something)
其中
O(logn)
是外循环,
something
是内循环


如何获得
O(N)

由于
i/=2
,外循环的复杂性为
O(logn)
。但内部循环有点棘手

内部循环的复杂性为
O(i)
,但是外部循环的每次迭代
i
都在变化。与外部循环相结合,您得到的复杂性为
O(n/logn)
。如下所示:

内部循环执行的步数类似于上所述的
1/(2n)
。首先,您正在执行
n
步骤,然后只执行
n/2
步骤,然后执行
n/4
步骤等等,直到您只执行
2
步骤,最后执行
1
步骤。这加起来就是
2n
的结果。总共运行内部循环
logn
次(由外部循环定义)。这意味着内部循环平均运行
2n次/log n
次。因此,您的复杂性为
O(n/logn)


使用
O(logn)
的外循环和
O(n/logn)
的内循环,您可以得到
O(logn*n/logn)
,可以简化为
O(n)

,您可能想看看,因为这就是您正在做的。@Progman-hmm,所以内循环是
O(n)
,外循环是
O(logn)
?是和否。内部循环是
O(i)
,但
i
正在从外部改变。与外部循环结合使用时,内部循环看起来像
O(N/logn)
。将其与外部
O(logn)
相乘,得到与给定答案相同的
O(N)
。@Progman你能详细说明一下
i
=
N/logn
?它是基于外部循环和
N
的内部循环的平均步数。第一次迭代是
n
步骤,最后一次迭代是
1
步骤。在您的帮助下获得
O(n/log n)
。谢谢。我唯一感到困惑的是为什么我们必须找到平均值?在外循环的每次迭代中(在
O(logn)
处运行),内循环将在
O(i)处运行
其中
i=2n
。那么为什么我们需要找到内环的平均大O呢?@csguy
i
不是
2n
。而是取决于外环的实际迭代。开始时是
n
,最后是
1
。所以平均值是
2n/logn
,即
O(n/logn)
。如果它是
i=2n
,那么你可以说它是
O(n)
(它不是),这将导致
O(n*logn)
(它不是)。你会根据外部循环的不同来计算迭代次数的平均值吗?你能看看你有时间吗
for (int i = n; i > 0; i /= 2) {
   for (int j = 0; j < i; j++) {
     //statement
   }
}
Answer: O(N)