Big o 谁能解释一下大O、大ω、大θ?

Big o 谁能解释一下大O、大ω、大θ?,big-o,discrete-mathematics,Big O,Discrete Mathematics,可能重复: 我想我在理论上理解它,但我在掌握三者的应用方面遇到了困难 在学校,我们总是用大O来表示算法的复杂性。例如,冒泡排序是O(n^2) 现在在阅读了更多的理论之后,我发现大Oh不是唯一的衡量标准,至少还有另外两个有趣的标准 但我的问题是: 大O是上界,大ω是下界,大θ是两者的混合。但这在概念上意味着什么?我理解它在图表上的含义;我见过无数这样的例子。但这对算法复杂性意味着什么呢?“上限”或“下限”是如何与之混合的 我想我就是不明白它的用途。我知道如果乘以某个常数c,如果在某个值n_0f(

可能重复:

我想我在理论上理解它,但我在掌握三者的应用方面遇到了困难

在学校,我们总是用大O来表示算法的复杂性。例如,冒泡排序是O(n^2)

现在在阅读了更多的理论之后,我发现大Oh不是唯一的衡量标准,至少还有另外两个有趣的标准

但我的问题是:

大O是上界,大ω是下界,大θ是两者的混合。但这在概念上意味着什么?我理解它在图表上的含义;我见过无数这样的例子。但这对算法复杂性意味着什么呢?“上限”或“下限”是如何与之混合的


我想我就是不明白它的用途。我知道如果乘以某个常数c,如果在某个值n_0f(x)大于g(x)之后,f(x)被认为是O(g(x))。但这实际上意味着什么?为什么我们要用f(x)乘以某个值c?见鬼,我认为用大O表示法,倍数并不重要。

大O表示法及其相关概念,大θ、大ω、小O和小ω都是关于函数在极限点(例如,当接近无穷大时,以及接近0时,等等)的表达方式没有说太多关于函数的其他内容。它们通常用于描述算法的运行空间和时间,但也可以在数学的其他领域中看到渐近行为

半直观的定义如下:

函数g(x)被称为O(f(x)),如果“从某个点开始”,g(x)低于c*f(x),其中c是某个常数

其他的定义是相似的,θ要求g(x)在f(x)的两个常数倍数之间,ω要求g(x)>c*f(x),而小版本要求这对所有这些常数都是正确的

但是,为什么说一个算法的运行时间是O(n^2)很有趣呢

这很有趣,主要是因为在理论计算机科学中,我们最感兴趣的是算法在大输入下的行为。这是正确的,因为在小的输入上,算法运行时间可能会因实现、编译、硬件和其他在理论上分析算法时并不真正感兴趣的事情而有很大的变化

然而,增长率通常取决于算法的性质,为了改进算法,您需要对您试图解决的问题有更深入的了解。例如,排序算法就是这样,您可以在O(n^2)中运行一个简单的算法(冒泡排序),但要将其改进为O(n log n),您需要一个真正的新想法,例如在合并排序或堆排序中引入的想法

另一方面,如果你有一个运行时间恰好为5n秒的算法,另一个运行时间为1000n秒(例如,这是长时间打哈欠和n=3的发射中断之间的差异),当你达到n=100000000000时,规模上的差异似乎不那么重要。但是,如果你有一个需要O(logn)的算法,你必须等待log(10000000000)=12秒,也许乘以某个常数,而不是几乎317098年,不管常数有多大,这是一个完全不同的尺度

我希望这能让事情变得更清楚一点。祝你学习顺利