我无法理解大O符号的定义

时间:2016-01-18 13:01:05

标签: data-structures time-complexity definition

本学期我正在学习数据结构课程,我无法理解大O符号的定义。

定义说f(n) = O(g(n))如果存在正常数Cn0,那么  所有f(n)<=C*g(n) n > n0。我理解为什么n > n0,它从n0点开始讨论,f(n)总是小于c*g(n)。但我无法理解为什么f(n)C*g(n)进行比较而不仅仅是g(n)

有人可以解释一下吗?

3 个答案:

答案 0 :(得分:1)

  

我无法理解为什么f(n)与C * g(n)相比而不仅仅是g(n)

因为它代表执行时间的顺序。在比较这方面的算法时,常数C或多或少没有意义。

考虑两种排序算法。冒泡排序为O(n ^ 2),而快速排序为O(n log(n))。这两个都需要时间比例到他们的顺序,但是会有一些常数乘以得到算法运行时间的合理近似值(它可能是一个不同的值常量两者之间)。

但是,对于每个算法的任何值C,都会有一些点(某些值为n),超出该值,快速排序总是更快。这就是&#34;大O符号&#34;就是这样。当你看到更大的图景时,常数C并不重要,这就是它被忽视的原因。

答案 1 :(得分:1)

因为它允许更多的succint和有用的比较。

使用C定义为

  

f大致(渐近地)以g(或更慢)的速度增长

如果没有C,我们将失去“粗略(渐近)”部分。如果没有C,我们不能只说f = O(n^2),我们必须说f = O(1.7 n^2)之类的内容(当然,除非因素恰好为1)。这不是特别有用。

Big O通常用于讨论算法类和比率。 f = O(n^2)说:“当您将n缩放两次时,计算会缩放4次。”对于O(4 n^2)O(1.7 n^2)或甚至O(0.01 n^2),这仍然适用。

Big O表示法的重点是表达渐近复杂性 - n变大时的趋势。我们不会关心同一n是否需要4倍或者同样多的一半;我们关心当n缩放时它如何缩放,并且这种缩放对于乘法常数是不变的。

更不用说在特定情况下修复确切常数非常困难。通常很容易证明,例如算法对每个输入位执行大约n次操作,因此具有n^2复杂度。但分析它是否对其他3 n元素的n / 2输入元素和2 n操作执行n / 2操作会是非常痛苦的。

答案 2 :(得分:-1)

big o = Worst,
BIG omega = Normal,
BIG theta = Good,

they just represent the scenario like BIG O means worst case scenario
For example in a loop 

    > For (int i =0 ;i <10000; i ++) 
    > break on some case 


BIG O will be 10000 if the break condition is not found.