Cormen中关于插入排序的矛盾

时间:2013-07-03 20:57:12

标签: algorithm sorting big-o time-complexity

在Cormen定理3.1中说


例如,插入排序最佳情况运行时间为 big-omega(n),而最差情况< / strong> 插入排序的运行时间为 Big-oh(n ^ 2)。 因此,插入排序的运行时间介于 big-omega(n) bigoh(n ^ 2)

之间

现在,如果我们看一下练习3.1-6,它会问


证明算法的运行时间为 Big-theta(g(n)),如果最差情况运行时间 Big-oh(g) (n))及其最佳案例运行时间为 big-omega(g(n))


  • 我是唯一一个在这里看到矛盾的人。
  • 我的意思是如果我们遵守必须证明的问题,我们得出结论,对于渐近更紧的界限( f(n)= Big-theta(g(n)))我们需要对于算法的最佳情况 Big-oh(g(n)) f(n)= big-omega(g(n)) >在最坏情况
  • 但在插入排序最佳情况的情况下,时间复杂度 big-omega(n)最差情况时间复杂度为大-OH(N ^ 2)

3 个答案:

答案 0 :(得分:2)

这里没有矛盾。该问题仅表明Big-Theta(g(n))Big-O(g(n))Big-Omega(g(n))渐近紧密约束Big-Theta(g(n))。如果您证明了这个问题,那么当且仅当Big-O(g(n))Big-Omega(g(n))之间运行时,您才能证明该函数在Big-Omega(n)中运行。

插入排序从Big-Oh(n^2)运行到Big-Theta(n^2),因此插入排序的运行时间不能与Big-Theta(n^2)紧密绑定。

事实上,CLRS从不使用{{1}}来严格限制插入排序。

答案 1 :(得分:2)

我觉得你在这里有点困惑。让我为你澄清几点。

运行时间可能意味着两件事:程序的实际运行时间,或者像theta或big-oh这样的有界函数(所以它有助于称之为时间复杂度,以避免我们将使用运行时间来计算程序的实际运行时间,并将时间复杂度用于表示Big-Oh / theta表示法。

拿起Big-Oh阅读我的回答here

一旦你明白了Big-Oh,其他功能就很容易落实到位。当我们说T(n)是Omega(g(n))时,我们指的是某个点k的右边曲线cg(n) )从下面限制运行时间曲线。换句话说:

T(n)>=c.g(n) for all n>=k, and for some constant c independent of input size.

而theta符号就像是说“我只是一个函数,但使用不同的常量,你可以让我从上到下限制运行时间曲线”

因此,当我们说T(n)是theta(g(n))时,我们的意思是

c1.g(N)==ķ

现在我们知道这些功能意味着什么,让我们看看CLRS在混乱中的位置。

  

例如,插入排序的最佳案例运行时间是big-omega(n),而插入排序的最坏情况运行时间是Big-oh(n ^ 2)。因此,插入排序的运行时间介于big-omega(n)和Bigoh(n ^ 2)

之间

这里的运行时间CLRS表示实际运行时间T(n)。措辞不好,你误解不是你的错。实际上我会继续说它们是错的。没有什么比像落在之间,一个函数在集合O(g(n))中,或者不是。所以这是一个错误。

  

证明算法的运行时间为Big-theta(g(n)),如果其最坏情况下的运行时间为Big-oh(g(n))且其最佳运行时间为big-omega(g( n))的

这里CLRS表示运行时间函数T(n),他们希望你弄清楚时间复杂度。

答案 2 :(得分:0)

没有矛盾,因为CLRS没有提到插入类型为theta(N ^ 2)。