繁体   English   中英

什么是Big O,此代码的上限

[英]What is the Big O, upper bound of this code

我有些困惑,我已经研究Big O时间复杂度了几个小时,并在这里阅读了所有文章。

 int myfunc(int n)
 { int result = 0;
   for (int i = 0; i<n; i++)
     for (int j = i; j>0; j--)
       if (i%j == 0)
         result += j;
   return result;
 }

我已经收到了这段代码,我想找到这段代码的上限。

现在,根据我到目前为止所学到的知识,我认为上限是O(n ^ 2),因为这是一个嵌套循环。 但是,由于J与I链接; 我想知道这段代码是否实际上是O(n log n),我不得不说我没有完全理解O(n log n)的概念。 但是我理解所有其他符号,例如... O(1),O(n),O(log n),O(n ^ 2),O(n!)。

对于外循环的每次迭代,内循环恰好进行了i次。

当i = 0时,内部循环运行0次。

当i = 1时,内部循环运行1次。

当i = 2时,内部循环运行2次。

...

当i = n-1时,内部循环运行n-1次。

因此,内循环运行的总次数= 0 + 1 + 2 + ... +(n-1)=(n *(n-1))/ 2 =(n ^ 2-n)/ 2 。

因此,涉及的计算总数=(n ^ 2--n)/ 2。

因此,给定代码的时间复杂度= O(n ^ 2)。

内循环开始迭代i次,并且由外循环控制, i增加1

因此,内环将收到123 ,..., n由外环和迭代,这归结为内部循环迭代1 + 2 + 3 + ... + n = n(n+1)/2

n(n+1)/2 = (n^2)/2 + n/2 该函数的增长主要由n^2因此上限可以称为O(n^2)

检查我刚刚运行的模拟。 在此处输入图片说明

答案是O(n ^ 2)。

假设i变量是矩阵的行号,j是列号。 使用此循环,您仅查看矩阵的一半。 这使您的时间复杂度为O(0.5n ^ 2),但这只是O(n ^ 2)。

要尝试帮助您了解O(n log(n)):

O(log(n))复杂度算法的一个示例是对数字排序列表进行二进制搜索。 通过检查中间元素并丢弃明显在您正在查看的数字上方或下方的列表的一半,可以将每次比较时设置的问题减半。

在全部为n的n个不同的集合上执行相同的二进制搜索将具有时间复杂度O(n log(n))。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM