为什么是这样的说法:
算法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)
T(n)
: Algo A 的运行时间。我们只关心语句的上限和下限:T(n) >= O(n^2)
Upper bound: 因为T(n) >= O(n^2)
, 那么没有关于T(n)
Lower bound: Assume 的上界的信息: Assume f(n) = O(n^2)
, 然后是语句: T(n) >= f(n)
, 但f(n)
可能是任何比n^2
, Ex:更“小”的东西constant, n,...
, 所以没有关于下界的结论T(n)
too
=> 声明毫无意义
一个原因可能是没有上限的下限不是很有用。“至少”意味着在正常情况下它可以是指数的。如果您不知道上限,您可能无法在实际应用程序中使用该算法,因为您无法知道程序是否在 Universe 完成之前完成。
正确使用大 O 表示法表示上限。因此,将下限声明为大 O 是在滥用该符号。
说“无意义”是一个强烈的词。即使它不充分,它当然也是有用的信息。为您的问题提供更多背景信息,您可以获得更好的帮助。
一个比喻:
这句话有点像说:“我家屋顶的高度至少是地面。” 没错,但完全没有信息。
O(n^2) 是最坏的情况,这意味着 A 的运行时间将是 n^2 或更快。如果它的运行时间至少为 O(n^2),那么这意味着 A 可以拥有的最快运行时间至少为 O(n^2)。这意味着它也可能比 O(n^2) 慢。这些语句意味着 A 可以有任何可能的运行时。
我知道任何线性函数 an+b 都是 O(n) 也是 O(n^2)。它也是 O(n^3) 吗?
是的。big-O 符号表示整个函数集合。但是我们应该用它来尽可能接近地描述一个函数。虽然这是真的,f(n) = an+b
甚至O(n^2)
是O(n^3)
这样说更准确f(n) = O(n)
。
O-notation,换句话说,意味着:f(x) 属于集合 O(g(x)) 如果 f(x) < C * g(x),对于所有 C(那些是实数)
即您的算法不会增长超过二次函数
这不是没有意义的,例如,如果您不知道确切的算法,可以使用它,但您当然知道它需要 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)
,因为运行时间总是非负数。因此,该声明是多余的。
“算法A的运行时间至少为O(n2)”等价于“算法A的运行时间是Big Omega(n2)”,所以不是没有意义。