为什么这个语句:
算法A的运行时间至少为O(n²)
是没有意义的?
插入排序算法的运行时间最多为O(n²),是正确的吗?
我在网络上找了很久,但没有找到一个好的解释。
我还有一个问题:
我知道任何线性函数a⋅n+b都是O(n)和O(n²)。它也是O(n³)吗?
为什么这个语句:
算法A的运行时间至少为O(n²)
是没有意义的?
插入排序算法的运行时间最多为O(n²),是正确的吗?
我在网络上找了很久,但没有找到一个好的解释。
我还有一个问题:
我知道任何线性函数a⋅n+b都是O(n)和O(n²)。它也是O(n³)吗?
T(n)
:Algo A的运行时间。我们只关心T(n)
的上限和下限。T(n) >= O(n^2)
上限:因为T(n) >= O(n^2)
,所以没有关于T(n)
的上限信息。f(n) = O(n^2)
,则有语句:T(n) >= f(n)
,但f(n)
可以是任何小于n^2
的东西,例如:常数、n...
,因此对于T(n)
的下限也没有结论。O(n^2)是最坏情况,这意味着A的运行时间将为n^2或更快。如果它的运行时间至少为O(n^2),那么这意味着A可以拥有的最快运行时间至少为O(n^2)。这意味着它也可能比O(n^2)更慢。这些陈述意味着A可以拥有任何可能的运行时间。
这并不是毫无意义的,例如当你不知道确切的算法,但你肯定知道它需要O(n^2)次操作时,就可以使用它。
例如,如果一个人不了解排序算法,但明白要对数组进行排序至少需要查看每个元素,那么他可以说“对数组进行排序至少是O(n)”。
因为没有人关心最佳情况下它的速度有多快,最坏情况很重要。通常人们更关心在最坏情况下需要多长时间。
设 f(n)
为该算法的运行时间。
=> f(n) >= O(n2)
=> f(n) >= 0 , because 0 is a member of set of functions that are O(n2)
对于f(n)
来说,这总是成立的,因为运行时间始终为非负数。因此,该语句是多余的。
T(n) = O(log n)
从这里我们已经有了
T(n) <= c.log n
至少O(n²)这个语句试图表达的意思是
T(n) <= c.n²
=> c.log n <= c.n² #for some c>0 and n>=n0
这是很显然的。当我们已经知道 T(n) <= c.logn
时,说 T(n) <= c.n2
并没有增加任何价值。
因此,当我们已经有一个算法的下限或上限时,说该界限至少或最多(分别)从不添加任何我们已经不知道的新信息。
回答您的第二个问题:
我知道任何线性函数 a⋅n+b 都是 O(n) 和 O(n²)。它也是 O(n³) 吗?
是的。根据上限(大O)的定义,这只意味着
a.n+b <= c.n
所以,如果这是真的,那么这也是真的。
a.n+b <= c.n³
大O符号
提供了算法运行时间的上限(最坏情况)。它绝对不是毫无意义的!此外,与算法平均情况分析相比,最坏情况复杂度的分析在大多数情况下更容易。Big O的简明英文解释 - Devendra D. Chavan