当前位置: 首页 > 知识库问答 >
问题:

科尔曼关于插入排序的矛盾

马哲
2023-03-14

在科尔门定理3.1中说

例如,插入排序的最佳运行时间是big-omega(n ),而插入排序的最差运行时间是Big-oh(n^2).因此,插入排序的运行时间介于大ω(n)和Bigoh(n^2之间

现在我们来看练习3.1-6,它问

证明了一个算法的运行时间是Big-θ(g(n)),如果它的最坏情况运行时间是Big-oh(g(n)),它的最佳情况运行时间是big-omega(g(n))

  • 我是唯一看到矛盾的人吗
  • 我的意思是,如果我们遵守必须证明的问题,我们得出结论,对于渐近紧边界(f(n)=大θ
  • 但在插入排序的情况下,最好的情况下时间复杂度是大ω(n),最坏的情况下的时间复杂度为大oh(n^2)

共有3个答案

熊博远
2023-03-14

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

谷梁俊楚
2023-03-14

这里并不矛盾。问题只陈述证明< code>Big-Theta(g(n))是由< code>Big-O(g(n))和< code>Big-Omega(g(n))渐近紧束缚的。如果你证明了这个问题,你只证明了一个函数运行在< code>Big-Theta(g(n))当且仅当它运行在< code>Big-O(g(n))和< code>Big-Omega(g(n))之间。

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

事实上,CLRS从不使用Big-Theta(n^2)来紧密绑定插入排序。

宋瀚海
2023-03-14

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

运行时间可能意味着两件事:程序的实际运行时间,或者像θ或big-oh这样的有界函数(所以它有助于调用这种时间复杂度,以避免混淆)。此后,我们将使用运行时间来表示程序的实际运行时间,以及时间复杂度来表示Big-Oh/θ符号。

要接大哦,请在这里阅读我的答案。

一旦你清楚了Big Oh,其他功能就很容易就位。当我们说T(n)是Omega(g(n))时,我们的意思是在某个点k的右边,曲线c.g(n)从下面限定了运行时间曲线。或者换句话说:

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

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

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

c1.g(n)==k

现在我们知道了这些函数的含义,让我们看看CLRS是如何陷入混乱的。

例如,插入排序的最佳运行时间是big-omega(n ),而插入排序的最差运行时间是Big-oh(n^2).因此,插入排序的运行时间介于大ω(n)和Bigoh(n^2之间

这里,运行时间CLRS表示实际运行时间T(n)。它措辞拙劣,误解不是你的错。事实上,我会说这是错误的。没有什么像介于两者之间,函数要么在集合O(g(n))中,要么不在集合O中。所以这是一个错误。

证明了一个算法的运行时间是Big-θ(g(n)),如果它的最坏情况运行时间是Big-oh(g(n)),它的最佳情况运行时间是big-omega(g(n))

这里 CLRS 表示运行时函数 T(n),他们希望您计算出时间复杂度。

 类似资料:
  • 插入排序 """ 插入排序核心思想 将数组分成一个有序数组和一个无序数组 每次从无序数组中提一个元素出来 插入到 有序元素的合适位置 """ from typing import List def insert_sort(arr: List) -> List: """ 插入排序 :param arr: :return: """ target =

  • 本文向大家介绍Java 插入排序之希尔排序的实例,包括了Java 插入排序之希尔排序的实例的使用技巧和注意事项,需要的朋友参考一下 Java 插入排序之希尔排序的实例 Java代码   运行后的结果为: Java代码   当分割的间隔为1时,变成了直接插入排序。 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  • 本文向大家介绍插入排序,包括了插入排序的使用技巧和注意事项,需要的朋友参考一下 这种分类技术与卡片分类技术相似,换句话说,我们使用插入分类机制对卡片进行分类。对于这项技术,我们从数据集中拾取一个元素,并移动数据元素以放置一个位置,以便将拾取的元素插入回数据集中。 插入排序技术的复杂性 时间复杂度:最佳情况为O(n),平均情况和最差情况为O(n ^ 2) 空间复杂度:O(1) 输入输出 算法 输入-

  • 插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。 1. 算法步骤 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一

  • 1. 前言 本节内容是排序算法系列之一:插入排序,主要讲解了插入排序的主体思路,选取了一个待排序的数字列表对插入排序算法进行了演示,给出了插入排序算法的 Java 代码实现,帮助大家可以更好地理解插入排序算法。 2. 什么是插入排序? 插入排序(Insert Sort),是计算机科学与技术领域中较为简单的一种排序算法。 顾名思义,插入排序是通过不断插入待排序的元素完成整个排序过程。插入排序是一种很

  • 插入排序,尽管仍然是 $$O(n^2)$$,工作方式略有不同。它始终在列表的较低位置维护一个排序的子列表。然后将每个新项 “插入” 回先前的子列表,使得排序的子列表称为较大的一个项。Figure 4 展示了插入排序过程。 阴影项表示算法进行每次遍历时的有序子列表。 Figure 4 我们开始假设有一个项(位置 0 )的列表已经被排序。在每次遍历时,对于每个项 1至 n-1,将针对已经排序的子列表中