本学期我正在学习数据结构课程,我无法理解大O符号的定义。
定义说f(n) = O(g(n))
如果存在正常数C
和n0
,那么
所有f(n)<=C*g(n)
n > n0
。我理解为什么n > n0
,它从n0
点开始讨论,f(n)
总是小于c*g(n)
。但我无法理解为什么f(n)
与C*g(n)
进行比较而不仅仅是g(n)
。
有人可以解释一下吗?
答案 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.