什么是Big O,这段代码的上限

时间:2016-04-13 17:13:02

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

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

%expect 1 /* or whatever */

我已将这段代码呈现给我,我想找到此代码的上限。

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

3 个答案:

答案 0 :(得分:3)

对于外循环的每次迭代,内循环恰好install.packages('devtools') devtools::install_github('ms609/ProfileParsimony') library('ProfileParsimony') Root(tree, outgroup) 次。

当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)。

答案 1 :(得分:3)

内部循环开始迭代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)

检查我刚刚运行的模拟。 enter image description here

答案 2 :(得分:1)

答案是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))。