我正在努力理解Big O,我无法完全理解我用来查找函数Big O的多种方式。似乎每个视频或帖子的方式都略有不同。
部分:逐行计算操作。 其他,计算分配,乘法和加法。
我知道这个问题可能会被低估/关闭但我觉得我真的需要一个专门针对我的问题的答案才能完全理解它。
在这个取自http://i.imgur.com/u0dUTlK.png
的伪代码中function sum(list):
sum = 0;
foreach element in list:
current = element
add current to sum
sum = sum * 1
return sum
endfunction
作者声明时间为1 + n * 2 + 2
,因为it sets sum to 0, which takes one operation
,it iterates over the list, performing two operations each time
和then, it performs two more operations
。
我不一定看到作者如何获得两个操作,而不是3个,即... current = element
是一个操作,在我看来,add current to sum
是两个操作(赋值)和补充)。同样,sum = sum * 1
作者声明这是一个操作,但我认为它是两个,return sum
另一个操作。因此,时间应为1 + n * 3 + 3
。
如果有人能告诉我,如果我不理解为什么这应该是两次操作,或者我真的是三次?
此外,从阅读中我注意到大多数人不倾向于将比较作为一种手术。是否可以省略比较?
最后,http://isites.harvard.edu/fs/docs/icb.topic780601.files/time_analysis_matrix_multiplication.pdf处的页面似乎是我发现的最有用的参考,但他们以完全不同的方式计算Big O.他们计算加法,乘法和赋值(再次省略比较),然后将它们加在一起。
代码:
for ( int i = 0; i < n; i++ ) {
for ( int j = 0; j < n; j++ ) {
c[i][j] = 0;
for ( int k = 0; k < n; k++ ) {
c[i][j] += a[i][k] * b[k][j];
}
}
}
它说n^3 multiplications
... 2n^3 + n^2 + n additions
... n^3 + 2n^2 + n + 1
作业......
删除系数和除最大项之外的所有系数:
它说
O(n^3) multiplications + O(n^3) additions + O(n^3) assignments = O(n^3) overall time complexity.
在添加这些内容时,从技术上来说n^3 + n^3 + n^3 = 3n^3
并删除系数,这会给我们留下n^3
吗?我问,因为我没有看到数学n^3 + n^3 + n^3 = n^3
。
我发现它最有帮助的方式是哈佛的页面是如何做到的:计算加法,乘法和赋值。我想知道是否有很多方法可以做到这一点,如果这是一种每次产生正确答案的方法?这是因为对于第一个伪代码示例,我们得到的等式将是不同的(预先去除系数,除了最大项之外)。
因此,如果我要对哈佛文档中的第一个伪代码示例进行处理,我会得到:
Multiplications: sum * 1... happens 1 time.
Additions: add current to sum, happens n times.
Assignments: sum = 0... happens 1 time. current = element, happens n times... add current to sum... happens n times.
1 multiplication + n additions + 1 + n + n assignments = 2 + 3n
Removing coefficients and all but largest term: O(n)
。
请注意,我没有在等式中包含return语句,并且我也没有包括在元素递增时发生n次的添加。真的,我不知道我需要保留什么以及我需要丢弃什么。
有人可以告诉我我将如何做到这一点,但是正确吗?我该怎么说,我应该保留什么?找到Big O的最简单方法是什么?就像在第一个例子中一样,如哈佛的例子,或者其他方式?我觉得我可以最好地与哈佛的例子联系起来,但是,我需要知道做这些规则时的规则。
感谢。
答案 0 :(得分:1)
O(n ^ 3)并不意味着n ^ 3个操作:这意味着操作的数量小于某个未知的常数n ^ 3。因此O(n ^ 3)+ O(n ^ 3)= O(n ^ 3):第一个小于某个常数n ^ 3,第二个小于某个常数n ^ 3,如果加上它们,总和小于一些(更大)的常数n ^ 3。