algorithm - 什么是大 O,这段代码的上限

标签 algorithm time-complexity big-o complexity-theory discrete-mathematics

我有点困惑,我已经研究 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)。

关于algorithm - 什么是大 O,这段代码的上限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36605234/

相关文章:

java - 使用 BigInteger 的 Karatsuba 乘法

c# - 查找小于 2 个整数 a 和 b 的 2 个最大数的算法,它们可以被彼此整除

algorithm - 在大小为 n 的数组中搜索 k 个元素

c++ - 提高c++中优先级队列的时间复杂度

java - Java 中 LinkedList.getLast() 的时间复杂度是多少?

Python/Numpy 查找长度变量跨度

algorithm - 使用邻接矩阵作为数据结构的 Kruskal 算法的时间效率

big-o - 为什么 O(n^2) 与 θ(n^2) 相同?

算法的运行时间优化

algorithm - 求解多源多目的 map 博弈