我知道大哦是上限,欧米茄是下限,但大多数地方我只看到很大的符号。
例如。在线性搜索算法中,最坏的情况是大哦(n)。 然而,搜索没有。可以在第一个地方找到。所以不行。输入是1.因此,这是最好的情况。所以,我们可以把它写成大欧米茄(1)。但我已经看到,在许多地方,大哦也用于最佳情况,但我不知道为什么。
我知道两种符号之间的理论差异。但是,我实际上无法理解它。
答案 0 :(得分:7)
有三个重要的复杂性类别:
重要的是要意识到O和Ω是松散的界限。它们不一定是最佳的。任何算法都有无限数量的上界和无限数量的下界。
例如,线性搜索可以说具有O( n 2 )的上界和Ω(1)的下界。我们知道它的实际复杂性介于这些界限之间。但是,通常情况下,说明非最佳边界并不常见。这些界限是正确的但没有用。
我们通常想要知道最小上限和最大下限。如果你说线性搜索是O( n 2 ),我可以改进你的答案并说不仅是O( n 2 ),它也是O( n )。这是一个较小的上限,因此更有用。
不仅如此,您还必须决定是否查看最差情况,平均情况或最佳情况。除非另有说明,否则复杂性分析通常会考虑最坏的情况。因此,虽然您可能会偶然发现您正在寻找的项目,但线性搜索的最坏情况是必须查看所有 n 项目。 最佳情况复杂度为O(1),但最差情况为O( n )。
如果你能证明O =Ω-最小上界和最大下界是相同的 - 那么你现在知道Θ。在最坏的情况下,线性搜索由顶部的O( n )和底部的Ω( n )限制,因此其最坏情况复杂度恰好是Θ( 名词的)。
大多数人说算法是O(无论如何)应该使用Θ(无论如何)。如果你知道边界是一个严格的上限和下限,那么Θ优于O.但是大多数人也不记得这些复杂性,所以Big-O已成为Theta的懒惰后备。
答案 1 :(得分:0)
我知道两种符号之间的理论差异。但是,我实际上无法理解它。
在描述算法时,Big O被更广泛地使用,因为通常更有用的是知道算法运行得多么糟糕,因此工程师可以为任何情况做好准备。
然而,Big Omega通常没有Big O那么有用。虽然很高兴知道算法能够运行的速度有多快,但在设计软件时,工程师需要知道最坏的情况,为任何情况做好准备。答案 2 :(得分:0)
当人们说运行时间是O(f(n))时,他们的意思是运行时间属于O(f(n))的函数类。
即,某些c的f(n)< = c.n且每n> = 0
在你的线性搜索的具体问题中,最坏的情况确实需要一些时间,即O(N)。
最好的情况需要一段时间 - 话虽这么说,人们松散地使用O(f(N))来表示它有点比例'到f(N)。T = k
。但是k属于O(1)类(因为某些+ ve Epsilon的k