Big o 下面代码的大O是什么?

Big o 下面代码的大O是什么?,big-o,time-complexity,Big O,Time Complexity,守则: int temp = 0; for (int h = 1; h <= n; h = h * 2) { for (int i = 1; i <= n; i++) { for (int j = 1; j<=n; j++) { for (int k = 1; k<i; k++) { temp++ } } } } int-temp=0; 对

守则:

int temp = 0;
for (int h = 1; h <= n; h = h * 2)
{
   for (int i = 1; i <= n; i++)
   {
      for (int j = 1; j<=n; j++)
      {
         for (int k = 1; k<i; k++)
         {
            temp++
         }
      }
   }
}
int-temp=0;
对于(int h=1;h
现在看看它,…(i,k)的执行总数是
n*(n+1)/2
,那么现在复杂度是多少

h*j*(i,k)=ln(n)*n*(n*(n+1)/2)=ln(n)*pow(n,3)

现在看看它,…(i,k)的执行总数是
n*(n+1)/2
,那么现在复杂度是多少


h*j*(i,k)=ln(n)*n*(n*(n+1)/2)=ln(n)*pow(n,3)

仅针对踢击,我使用不同的n值运行此代码:

               n                  temp               O?
     -----------        --------------        ---------
               1                     0
              10                  1800        1.8 x n^3
             100               3465000        3.5 x n^3
            1000            4995000000        5.0 x n^3
           10000         6999300000000        7.0 x n^3  (and took a LONG time!)

结论:log(n)*n^3

仅仅为了踢球,我用不同的n值运行了这段代码:

               n                  temp               O?
     -----------        --------------        ---------
               1                     0
              10                  1800        1.8 x n^3
             100               3465000        3.5 x n^3
            1000            4995000000        5.0 x n^3
           10000         6999300000000        7.0 x n^3  (and took a LONG time!)

结论:log(n)*n^3

骑士基本上是正确的,但是如果你想要正确的数字,你不能只说“我取
I
的最大值”

是的,它在术语
f(n)=O(…)
中是正确的,但是您也可以编写
f(n)=O(n^15)
,这也将是正确的

最后一个循环执行n次,然后n-1次,然后n-2次等等,这是
n+n-1+n-2+n-3….+3+2+1
,这是
n(n+1)/2
。现在你可以将它相乘,得到
n(n+1)/2=n^2/2+n/2
,在渐进运算中可以忽略常数,这意味着
n^2/2+n/2=θ(n^2+n)
,也可以转换为
n^2+n=Theta(n^2)

所以,结果毕竟没有改变,但你必须确定


最终结果是骑士所描述的
n^3*log_2(n)
,骑士基本上是对的,但是如果你想要正确的数字,你不能只说“我取
I
的最大值”

是的,它在术语
f(n)=O(…)
中是正确的,但是您也可以编写
f(n)=O(n^15)
,这也将是正确的

最后一个循环执行n次,然后n-1次,然后n-2次等等,这是
n+n-1+n-2+n-3….+3+2+1
,这是
n(n+1)/2
。现在你可以将它相乘,得到
n(n+1)/2=n^2/2+n/2
,在渐进运算中可以忽略常数,这意味着
n^2/2+n/2=θ(n^2+n)
,也可以转换为
n^2+n=Theta(n^2)

所以,结果毕竟没有改变,但你必须确定

最后的结果是knightrider描述的
n^3*log_2(n)

使用Sigma符号分析算法的复杂性 为了完整性:当分析嵌套循环和相关循环的时间复杂性时,比如在您的算法中,Sigma符号是一个很好的工具

在哪里⌊x⌋ 和⌈x⌉ 是最重要的

从上面可以看出,该算法渐近行为的上界是
O(n^3 log_2(n))


使用西格玛表示法估计实际迭代次数

西格玛符号分析除了是大O(-Ω,-Θ)分析的严格工具外,如果我们对计算或估计算法的实际迭代次数感兴趣,它也很有用

我们使用计算前的公式比较估计的迭代次数≤ 上面的符号和@JohnHascell:s答案中给出的实际迭代次数

// our formula (pseudo-code / matlab-compliant)
numIt(n) = n*ceil(log2(n))*(n^2-n)/2;

// comparison with actual count:
--------------------------------------------------------- 
           n     actual # of iter.   estimated # of iter. 
               (from @JohnHascell)   (from formula above)
------------   -------------------   --------------------
           1                     0                      0
          10                 1 800                  1 800
         100             3 465 000              3 465 000
        1000         4 995 000 000          4 995 000 000
       10000     6 999 300 000 000      6 999 300 000 000
--------------------------------------------------------- 
我们看到公式中的计数与实际计数完全一致;在这种情况下,估计实际上是一个实际计数。

使用西格玛符号分析算法的复杂性 为了完整性:当分析嵌套循环和相关循环的时间复杂性时,比如在您的算法中,Sigma符号是一个很好的工具

在哪里⌊x⌋ 和⌈x⌉ 是最重要的

从上面可以看出,该算法渐近行为的上界是
O(n^3 log_2(n))


使用西格玛表示法估计实际迭代次数

西格玛符号分析除了是大O(-Ω,-Θ)分析的严格工具外,如果我们对计算或估计算法的实际迭代次数感兴趣,它也很有用

我们使用计算前的公式比较估计的迭代次数≤ 上面的符号和@JohnHascell:s答案中给出的实际迭代次数

// our formula (pseudo-code / matlab-compliant)
numIt(n) = n*ceil(log2(n))*(n^2-n)/2;

// comparison with actual count:
--------------------------------------------------------- 
           n     actual # of iter.   estimated # of iter. 
               (from @JohnHascell)   (from formula above)
------------   -------------------   --------------------
           1                     0                      0
          10                 1 800                  1 800
         100             3 465 000              3 465 000
        1000         4 995 000 000          4 995 000 000
       10000     6 999 300 000 000      6 999 300 000 000
--------------------------------------------------------- 

我们看到公式中的计数与实际计数完全一致;在这种情况下,估计值实际上是一个实际计数。

你的意思是
kSeems就像你已经有了正确的答案一样;我相信h*2使第一个循环有O(logn),所有其他的都有n,这意味着你得到了logn*n^4。因为这是一个大的Oh符号,你也应该简化这个表达式。谢谢你指出“谢谢你的时间,@Stian@Stian-为什么是n^4?有三个内部循环你的意思是
k看起来你已经有了正确的答案;我相信h*2使第一个循环有O(logn),所有其他的都有n,这意味着你得到了logn*n^4。因为这是一个大的Oh符号,你也应该简化这个表达式。谢谢你指出“我感谢你的时间,@Stian@Stian-为什么是n^4?有三个内循环,但最后一个循环每次都要运行到i的最大值。它运行的时间是1+2+3+4+…+n。可以用求和来代替,即n(n+1)/2@FarazMazhar最简单的思考方法就是我解释的。看看k的最大值。它是n。它永远不能超过n。这就是为什么它是正确的。我将解释在回答中使用n(n+1)/2的错误是什么,但是在
n(n+1)中使用第一个
n
/2
j
循环运行的
n
倍。因此,我们忽略了(n+1)/2部分?@johnhascall第一个
n
n瓦片
i
不运行
j
。我在想如何以简单的方式解释。你做得很好:),但最后一个循环每次都不会运行到i的最大值。它正在运行1+2+3+4+…+N可以用总和代替,即n(n+1)/2@FarazMazhar思考问题的最简单方法