`

排序问题的计算复杂性

阅读更多
引用
http://www.ahhf45.com/info/Data_Structures_and_Algorithms/algorithm/commonalg/sort/internal_sorting/chapter1.htm


对排序算法计算时间的分析可以遵循若干种不同的准则,通常以排序过程所需要的算法步数作为度量,有时也以排序过程中所作的键比较次数作为度量。特别是当作一次键比较需要较长时间,例如,当键是较长的字符串时,常以键比较次数作为排序算法计算时间复杂性的度量。当排序时需要移动记录,且记录都很大时,还应该考虑记录的移动次数。究竟采用哪种度量方法比较合适要根据具体情况而定。在下面的讨论中我们主要考虑用比较的次数作为复杂性的度量。

为了对有n个元素的线性表进行排序,至少必须扫描线性表一遍以获取这n个元素的信息,因此排序问题的计算复杂性下界为Ω(n)。

如果我们对输入的数据不做任何要求,我们所能获得的唯一信息就是各个元素的具体的值,我们仅能通过比较来确定输入序列<a1,a2,..,an>的元素间次序。即给定两个元素ai和aj,通过测试ai<aj ,ai≤aj ,ai=aj ,ai≥aj ,ai>aj 中的哪一个成立来确定ai和aj间的相对次序。这样的排序算法称为比较排序算法。下面我们讨论一下比较排序算法在最坏情况下至少需要多少次比较,即比较排序算法的最坏情况复杂性下界。

我们假设每次比较只测试ai≤aj ,如果ai≤aj 成立则ai排在aj 前面,否则ai排在aj 后面。任何一个比较排序算法可以描述为一串比较序列:

     (ai,aj),(ak,al),..,(am,an),...

表示我们首先比较(ai,aj),然后比较(ak,al),...,比较(am,an),...,直到我们获取了足够的信息可以确定所有元素的顺序。显而易见,如果我们对所有的元素两两进行一次比较的话(总共比较了Cn2次),就一定可以确定所有元素的顺序。但是,如果我们运气足够好的话,我们可能不必对所有元素两两进行一次比较。比如说对于有三个元素a1,a2,a3的线性表进行排序,如果我们先比较a1和a2,得到a1≤a2;然后比较a2和a3,得到a2≤a3;则不必比较a1和a3,因为根据偏序集的传递性,必有a1≤a3;但是如果a2≥a3,我们还必须比较a1和a3才能确定a1和a3的相对位置。如果我们适当的安排比较的次序的话,也可以减少比较的次数。这样我们可以用一棵二叉树表示比较的顺序,如下图所示:


该树的每一个非叶节点表示一次比较,每一根树枝表示一种比较结果,每一个叶节点表示一种排列顺序。这样的一棵二叉树叫做决策树,它用树枝表示了每次决策做出的选择。如此我们可以将任何一个比较排序算法用一棵决策树来表示。

请注意上图只表明了对三个元素的一种比较算法,这种比较算法依次比较(a1,a2)(a2,a3)(a1,a3),一旦中间某步得到足够的信息就可以停止比较,但是当算法执行完后(三次比较后),一定可以确定三个元素间的次序。因此我们有理由将算法在最坏情况下的比较次数作为算法复杂性的度量,对于本例该算法在最坏情况下要进行C32=3次比较。

显然,一棵决策树中最高叶节点的高度就是该决策树对应的算法在最坏情况下所需的比较次数,而决策树中最低叶节点的高度就是该决策树对应的算法在最好情况下所需的比较次数。

我们的问题就变为:对于任意一棵决策树(任意一种比较排序算法),它的最高的树叶的高度是多少?这个高度就对应于比较排序算法所需的最多比较次数(在运气最坏的情况下);换句话说,对于任何一个输入,该算法至少需要比较多少次就可以对元素进行排序。

我们发现,决策树的每个叶节点对应一个n个元素的排列,其中可能有重复的;但是由于决策树表明了所有可能遇到的情况,因而n个元素的所有排列都在决策树中出现过。n个元素共有n!种排列,即决策树的叶节点数目至少为n!。又因为一棵高度为h的二叉树(指二叉树的最高树叶高度为h)的叶节点数目最多为2h个(这时正好是满二叉树,即每个非叶节点都有两个子节点),因此n!≤2h,得到h≥log(n!),其中log以2为底。根据Stirling公式有n!>(n/e)n,于是h>nlogn-nloge,即h=Ω(nlogn)。

这样我们就证明了对于任意一种利用比较来确定元素间相对位置的排序算法,其最坏情况下复杂性为Ω(nlogn)。

在下文中我们将讨论几种比较排序算法,其中快速排序在平均情况下复杂性为O(nlogn),最坏情况下复杂性为O(n2);堆排序和合并排序在最坏情况下复杂性为O(nlogn),因此堆排序和合并排序是渐进最优的比较排序算法。

排序算法是否还能够改进呢?从前文我们知道,如果要改进排序算法的效率,就不能只利用比较来确定元素间相对位置。因此我们还需要知道元素的其他附加信息,光知道元素的大小信息是不够的。下文中我们介绍的计数排序,基数排序和桶排序是具有线性时间复杂性的排序算法,这些算法无一例外地对输入数据作了某些附加限制,从而增加已知的信息,因此可以不通过比较来确定元素间的相对位置。
分享到:
评论

相关推荐

    《大学计算机-计算思维导论》16-18学时-排序问题及其算法-ding-20201

    第四章 算法与复杂性4.1 排序问题及其算法哈尔滨工业大学 (深圳)计算机学院4.1.1 排序问题--结构化数据表查找问题(1)什么是排序问题排序问题对一组对象

    归并排序算法(计算机算法与分析)

    归并排序算法,有程序和复杂性分析,还有解释,挺清楚的,很有用

    排序算法.pdf

    陕西科技大学学校的排序算法实验,最近小咲...2. 使用不同的数据结合计算各种算法的运行时间,验证算法的时间复杂性 3. 能够运用二路归并算法进行外排序 4. 了解败者树算法,并运用多路归并算法进行外排序(未能实现)

    论文研究-求解作业排序问题的通用混合遗传算法研究.pdf

    车间作业排序理论是生产管理与组合优化领域的重要研究方向 ,由于其固有的计算复杂性( NP-Hard) ,一般无法利用经典方法求出最优解。本文针对一般作业排序问题 ,将遗传算法...

    分而治之算法 分而治之策略也可以运用到高效率的计算机算法的设计过程中。

    君主和殖民者们所成功运用的...本章给出了用来分析分而治之算法复杂性的数学方法,并通过推导最小最大问题和排序问题的复杂性下限来证明分而治之算法对于求解这两种问题是最优的(因为算法的复杂性与下限一致)。

    内部排序算法的比较 完整版数据结构课程设计

    特别是当作一次键比较需要较长时间,例如,当键是较长的字符串时,常以键比较次数作为排序算法计算时间复杂性的度量。当排序时需要移动记录,且记录都很大时,还应该考虑记录的移动次数。究竟采用哪种度量方法比较...

    冒泡排序-排序过程 冒泡排序-排序过程

    该算法的时间复杂性为O(n2),算法为稳定的排序方 冒泡排序-冒泡排序法的改进 比如用冒泡排序将4、5、7、1、2、3这6个数排序。在该列中,第二趟排序结束后,数组已排好序,但计算机此时并不知道已经反排好序,...

    计算机组成原理课程设计复杂模型机设计实现冒泡排序

    本资源选择的是实现冒泡排序算法,报告含有项目任务,总体思路,技术路线,可行性分析,复杂模型机,项目内容,项目实施,项目成果,项目总结,参考文献。本报告可以直接使用,格式已经调好。 项目成果含有线路连接...

    论文研究-基于图的流行排序的显著目标检测改进算法.pdf

    针对现有基于图的流行排序的显著目标检测研究算法对于背景先验假设过于理想导致其在复杂背景图像检测中效果较不佳的问题,提出一种基于仿射传播聚类和流行排序的改进算法。首先根据位于边界的超像素集的颜色对比度...

    网络重要节点排序方法综述_任晓龙(带附表)

    复杂网络的重要节点是指相比网络其他节点而言,能够在更大程度上影响网络的结构与功能的一些特殊节点.近年来,节点重要性排序研究...在此基础上,本文分析了重要节点排序研究现存的一些问题,并展望了若干重要的开放性问题

    论文研究-基于Hadoop的多关键字排序方法研究.pdf

    方法一在Reduce函数中使用链式基数排序算法按多关键字对大数据并行排序,利用多个节点的计算能力提高排序的效率。方法二通过定义组合键和比较器实现了对记录的多个关键字按字节比较,节省了将字节流反序列化为对象的...

    计算机算法设计与分析

    第三章 分治算法:算法的基本思想、归并排序、快速排序、最短路经、选择问题等实例分析。 第四章 贪心算法:最优化问题、贪心算法的基本思想、背包问题、旅行商问题、最短路径问题等实例分析。 第五章 动态规划...

    误工工件个数最少的多目标排序问题 (2009年)

    考虑在误工工件个数最少的约束条件下使得工件集合的总完工...然而以往文献中的例子显示,这样得到的解并不总是最优解,这就暗示了该问题的复杂性,因此给出了不同于以往文献的分支定界算法及其Matlab解,简化了计算过程.

    算法设计与分析 清华大学出版社

    第四部分包括第12~15章,介绍算法设计与分析中的一些理论问题,如NP完全问题、计算复杂性问题、下界理论问题,最后介绍了近似算法及其性能分析。本书内容选材适当,编排合理,由浅入深,循序渐进,互相衔接,逐步...

    算法分析与设计讲义(排序算法,贪心算法,回溯算法等)

    该课件详细讲述了各种排序算法、贪心算法、回溯算法,一些经典问题的算法以及一些计算复杂性理论

    第6讲 算法、数据结构简介及顺序结构和选择结构.pptx

    在信息时代,计算思维是分析复杂工程问题的重要思维方式,计算机则是求解问题的重要工具。本课程以计算机经典问题求解为导向,通用算法思维和自动编程流程图培养为目标,引入经典算法,精心安排课程的理论教学和编程...

    托尼·霍尔(C. A. R. Hoare)在1962年发表的关于快速排序算法的原始论文《Quicksort》.zip

    这篇论文对快速排序算法的描述是基于分治法的原则,通过将一个复杂的排序问题分解为两个更简单的子问题来解决。通过选定一个基准值(pivot),将数据分为两部分,一部分包含所有小于基准值的元素,另一部分包含所有...

    高级算法课件 通俗易懂

    分支与限界 算法的复杂性分析 随机算法 动态规划 回溯 排序问题和离散集合的操作 NP完全问题 计算复杂性 下界 近似算法 计算几何问题 图和网络问题 递归和分治 贪婪法 算法的基本概念

    TSP旅行商问题分支限界法和回溯法源码

    TSP旅行商问题分支限界法...计算复杂性高,NP-hard问题,无有效的(复杂性为多项式级别)的解法 Metric TSP 欧式空间满足三角形关系 应用: 军事、通信、电路板设计、大规模集成电路、基因排序等领域具有广泛应用

    算法设计与分析王晓东

    4.5.2 算法的正确性和计算复杂性 4.6 最小生成树 4.6.1 最小生成树性质 4 6.2 Prim算法 4.6.3 Kruskal算法 4.7 多机调度问题 4.8 贪心算法的理论基础 4.8.1 拟阵 4.8.2 带权拟阵的贪心算法 4.8.3 任务时间表问题 小...

Global site tag (gtag.js) - Google Analytics