Big o 有人帮我解释这段代码的BigO复杂性,有两部分让我很困惑

Big o 有人帮我解释这段代码的BigO复杂性,有两部分让我很困惑,big-o,Big O,此代码的正确答案是Onlog n^2。 基本上是这样的,外环的一半,中间环增加了两倍,它们都是logn,内环是n,乘以logn*logn*n。但是有人告诉我中间循环和内部循环是相互依赖的,所以它们应该看起来像一个代码,有人能给我解释一下吗。但是,如果它们是一个代码,我不应该加n+logn而不是乘它们吗?而且外部循环不是嵌套的,所以它独立于其他两个循环,对吗 for ( i = 1, i<n; i * = 2) { for ( j = n, j>0; j

此代码的正确答案是Onlog n^2。 基本上是这样的,外环的一半,中间环增加了两倍,它们都是logn,内环是n,乘以logn*logn*n。但是有人告诉我中间循环和内部循环是相互依赖的,所以它们应该看起来像一个代码,有人能给我解释一下吗。但是,如果它们是一个代码,我不应该加n+logn而不是乘它们吗?而且外部循环不是嵌套的,所以它独立于其他两个循环,对吗

     for ( i = 1, i<n; i * = 2) {
          for ( j = n, j>0; j / = 2) {
                 for ( k = j, k<n; k += 2) {
                         sum + = (i + j * k);
                }
            }
          }

这一个从n开始,一直下降到j,因为这两个循环本质上做相同的事情:循环log2n次,执行内部的内容

log(n)*log(n)*(n/2) = (n/2)*log(n)^2
这就是得到logN^2的原因,因为我们可以假设N非常大,对于k=j,k复杂性在logN上

由于J和K在K=J上的相互依赖性,不能单独考虑内2个环。为便于计算,设n=2^m。所以,j将是2^m,2^m-1,2^m-2,4、2、1和最里面的循环在每次到达时执行n-j/2次。因此,组合的内部两个循环执行

for ( i = 1, i<n; i * = 2) {
      for ( j = n, j>0; j / = 2) {

这是a,等于2^m+1-1=2n-1,这是开的。现在,在外部循环中,由于i*=2,它是OlogN,我们得到logN。

使用西格玛符号,看一下幻灯片8、9和12


可能是重复的我更深入地研究了它。@Degustaf它不是重复的,你的答案很可能是错误的。n^2大于n*logn^2,并且不难看出它至少是一个n*logn^2。@Horsessmith你是对的。我没有注意到是I*=2而不是I++。我已经改正了。
for ( k = j, k<n; k += 2) {
log(n)*log(n)*n = n*log(n)^2
log(n)*log(n)*(n/2) = (n/2)*log(n)^2
for ( i = 1, i<n; i * = 2) {
      for ( j = n, j>0; j / = 2) {
  2^m + 2^(m-1) + 2^(m-2) + ... + 4   + 2   + 1
= 2^m + 2^(m-1) + 2^(m-2) + ... + 2^2 + 2^1 + 2^0