【问题标题】:Multiple ways of finding Big O of a function找到函数大 O 的多种方法
【发布时间】:2014-03-23 10:17:34
【问题描述】:

我很难理解大 O,我无法完全理解我阅读和观察用于查找函数大 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 operationit iterates over the list, performing two operations each timethen, 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 assignments...

删除系数和除最大项之外的所有项:

它说
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 次的加法。真的,我不知道我需要保留什么,需要丢弃什么。

有人可以告诉我如何能够做到以上,但正确吗?我应该省略什么,我应该保留什么?找到大 O 的最简单方法是什么?像第一个例子一样,像哈佛的例子一样,还是其他方式?我觉得我可以最好地与哈佛的例子联系起来,但是,我需要知道这样做时的规则是什么。

谢谢。

【问题讨论】:

  • 您能否接受答案或提供反馈,以便完成此问题?谢谢。

标签: big-o computer-science


【解决方案1】:

O(n^3) 并不表示 n^3 次操作:它表示操作次数小于某个未知常数乘以 n^3。因此O(n^3) + O(n^3) = O(n^3):第一个小于某个常数倍n^3,第二个小于某个常数倍n^3,如果加上他们,总和小于一些(更大的)常数乘以n^3。

【讨论】:

    猜你喜欢
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多