笔记

我们所熟知的插入排序、归并排序、快速排序等排序算法,它们的排序过程都依赖于比较元素间的大小,我们称这些算法为比较排序。本节讨论比较排序算法的运行时间的下界。
  给定一个输入序列 < a 1 , a 2 , … , a n > <a_1, a_2, …,a_n> <a1​,a2​,…,an​>。为简化分析,假定所有输入元素都是互异的。
  比较排序可以抽象为一棵决策树。下图决策树展示了插入排序算法作用于包含3个元素的输入序列的情况。决策树是一棵完全二叉树。每个非叶结点都以 i : j i : j i:j标记,表示一对元素 a i a_i ai​和 a j a_j aj​的比较过程。插入排序从根结点开始,根据结点的比较结果,逐层向下走。在一个非叶结点,如果比较之后确定两个元素的大小关系为 a i ≤ a j a_i ≤ a_j ai​≤aj​,那么进入左子树;如果比较之后确定两个元素的大小关系为 a i > a j a_i > a_j ai​>aj​,那么进入右子树。当到达一个叶结点时,表示已经排好序。每一个叶结点都表示一个可能的排好序的序列。
  
  对于一个有 n n n个元素的序列来说,可能的排好序的序列一共有 n ! n! n!种,对应的决策树就有 n ! n! n!个叶结点。一个排序过程的运行时间取决于它所包含的比较次数。对于一个确定的排序过程,比较次数等于从决策树的根结点到一个叶结点的路径长度。因此,一个排序算法的最坏情况比较次数等于其决策树的高度,即从根结点到最低层次叶结点的路径长度。
  考虑一棵高度为 h h h、具有 l l l个叶结点的决策树,它对应一个有 n n n个输入元素的排序算法。因为输入数据的 n ! n! n!种可能的排列都是叶结点,所以有 n ! ≤ l n! ≤ l n!≤l。由于在一棵高度为 h h h的二叉树中,叶结点的数目最多为 2 h 2^h 2h个,因此有 n ! ≤ l ≤ 2 h n! ≤ l ≤ 2^h n!≤l≤2h。对该式取对数,得到 h ≥ l g ( n ! ) = Ω ( n l g n ) h ≥ {\rm lg}(n!) = Ω(n{\rm lg}n) h≥lg(n!)=Ω(nlgn)。于是可以得到,在最坏情况下,任何比较排序算法都至少需要做 Ω ( n l g n ) Ω(n{\rm lg}n) Ω(nlgn)次比较。

练习

8.1-1 在一棵比较排序算法的决策树中,一个叶结点可能的最小深度是多少?
  
  
8.1-2 不用斯特林近似公式,给出 l g ( n ! ) {\rm lg}(n!) lg(n!)的渐近紧确界。利用A.2节中介绍的技术来累加和 ∑ k = 1 n l g k \sum_{k=1}^{n}{\rm lg}k ∑k=1n​lgk。
  
   l g k {\rm lg}k lgk为单调递增函数,根据A.2节结论,可以通过积分近似方法来累加和 ∑ k = 1 n l g k \sum_{k=1}^n{\rm lg}k ∑k=1n​lgk的渐近紧确界。
   ∑ k = 1 n l g k = l g 1 + ∑ k = 2 n l g k = ∑ k = 2 n l g k ≥ ∫ 1 n ( l g k ) d k = n l g n − ( n − 1 ) l n 2 \sum_{k=1}^n{\rm lg}k={\rm lg}1+\sum_{k=2}^n{\rm lg}k=\sum_{k=2}^n{\rm lg}k≥∫_1^n({\rm lg}k)dk=n{\rm lg}n-\frac{(n-1)}{{\rm ln}2} ∑k=1n​lgk=lg1+∑k=2n​lgk=∑k=2n​lgk≥∫1n​(lgk)dk=nlgn−ln2(n−1)​
  由上式可以得到, ∑ k = 1 n l g k = Ω ( n l g n ) \sum_{k=1}^n{\rm lg}k=Ω(n{\rm lg}n) ∑k=1n​lgk=Ω(nlgn)成立。
  
8.1-3 证明:对 n ! n! n!种长度为 n n n的输入中的至少一半,不存在能达到线性运行时间的比较排序算法。如果只要求对 1 / n 1/n 1/n的输入达到线性时间呢? 1 / 2 n 1/2^n 1/2n呢?
  
  一棵高度为 h h h的决策树最多有 2 h 2^h 2h个叶结点。
  对于一个含 n n n个元素的序列,如果可能的排列一共有 n ! / 2 n!/2 n!/2种,那么其决策树的叶结点数目满足 2 h ≥ n ! / 2 2^h ≥ n!/2 2h≥n!/2。可以得到 h ≥ l g ( n ! ) − 1 = Ω ( n l g n ) h ≥ {\rm lg}(n!) − 1 = Ω(n{\rm lg}n) h≥lg(n!)−1=Ω(nlgn)。因此对于至少 n ! / 2 n!/2 n!/2种可能的排列,比较排序算法也不能达到线性运行时间。
  如果可能的排列一共有 n ! / n n!/n n!/n种,,那么其决策树的叶结点数目满足 2 h ≥ n ! / n 2^h ≥ n!/n 2h≥n!/n。可以得到 h ≥ l g ( n ! ) − l g n = Ω ( n l g n ) h ≥ {\rm lg}(n!) − {\rm lg}n = Ω(n{\rm lg}n) h≥lg(n!)−lgn=Ω(nlgn)。这种情况下,比较排序算法也不能达到线性运行时间。
  如果可能的排列一共有 n ! / 2 n n!/2^n n!/2n种,,那么其决策树的叶结点数目满足 2 h ≥ n ! / 2 n 2^h ≥ n!/2^n 2h≥n!/2n。可以得到 h ≥ l g ( n ! ) − n = Ω ( n l g n ) h ≥ {\rm lg}(n!) − n = Ω(n{\rm lg}n) h≥lg(n!)−n=Ω(nlgn)。这种情况下,比较排序算法也不能达到线性运行时间。

8.1-4 假设现有一个包含 n n n个元素的待排序序列。该序列由 n / k n/k n/k个子序列组成,每个子序列包含 k k k个元素。一个给定子序列中的每个元素都小于其后继子序列中的所有元素,且大于其前驱子序列中的每个元素。因此,对于这个长度为 n n n的序列的排序转化为对 n / k n/k n/k个子序列中的 k k k个元素的排序。试证明:这个排序问题中所需比较次数的下界是 Ω ( n l g k ) Ω(n{\rm lg}k) Ω(nlgk)。(提示:简单地将每个子序列的下界进行合并是不严谨的。)
  
  正如提示所言,我们不能简单将每个子序列的下界进行合并。因为这种做法引入了一个前提,那就是我们采用的排序算法必须是独立地对每个子序列进行排序的,元素间的比较仅限于各子序列内部。而对于那些存在跨子序列比较的排序算法,这一做法并没有考虑进来。因此这一做法是不严谨的。
  我们还是需要将整个序列当做一个整体来考察。每个子序列都有 k ! k! k!种可能的排列,一共有 n / k n/k n/k个子序列,那么整个序列一共有 ( k ! ) n / k (k!)^{n/k} (k!)n/k种可能的排列。假定针对该序列的排序算法的决策树的高度为 h h h,那么满足 2 h ≥ ( k ! ) n / k 2^h ≥(k!)^{n/k} 2h≥(k!)n/k,两边取对数可得到
   h ≥ l g [ ( k ! ) n ⁄ k ] = n k l g ( k ! ) = Ω ( n l g k ) h≥{\rm lg}[(k!)^{n⁄k} ]=\frac{n}{k}{\rm lg}(k!)=Ω(n{\rm lg}k) h≥lg[(k!)n⁄k]=kn​lg(k!)=Ω(nlgk)

算法导论 — 8.1 排序算法的下界相关推荐

  1. 【算法导论】 内部排序算法总结

    排序名称 时间复杂度 空间复杂度 稳定性 直接插入排序 O(n^2) O(1) 稳定 折半插入排序 O(n^2) O(1) 稳定 希尔排序 O(n^2) O(1) 不稳定 冒泡排序 O(n^2) O( ...

  2. 机器学习的算法和普通《算法导论》里的算法有什么本质上的异同

    机器学习的算法和普通<算法导论>里的算法有什么本质上的异同? 本人非计算机专业出身,对这些方向感兴趣,所以有此一问.曾经问过一些人,说是机器学习全是数学,是用数学的方式试图去描述和理解我们 ...

  3. 算法导论NO.1:算法基础

    目录 算法导论NO.1:算法基础 前言 一.算法是什么? 二.算法的特征 1.有穷性 2.确切性 3.输入 4.输出 5.可行性 三.算法的评价 总结 前言 新坑今天来填第一天,最近返校后培训数学建模 ...

  4. 算法 - 十大经典排序算法(动图演示)

    [TOC] 算法 - 十大经典排序算法(动图演示) ​ 在计算机科学与数学中,一个排序算法(英语:Sorting algorithm)是一种能将一串资料依照特定排序方式进行排列的一种算法.最常用到的排 ...

  5. Java实现算法导论中线性规划单纯形算法

    需在理解算法导论中线性规划单纯性算法基础上理解Java实现的代码,结合http://blog.csdn.net/fjssharpsword/article/details/53195556理解. 具体 ...

  6. 排序算法 - 面试中的排序算法总结

    排序算法总结 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不 ...

  7. 机器学习(二十二)——推荐算法中的常用排序算法, Tri-training

    推荐算法中的常用排序算法 Pointwise方法 Pranking (NIPS 2002), OAP-BPM (EMCL 2003), Ranking with Large Margin Princi ...

  8. 基本算法研究1-冒泡排序算法测试

    基本算法研究1-冒泡排序算法测试 1.经典冒泡排序法基本原理 先看一个动态图,感觉比较形象: 冒泡排序(Bubble Sort)是一种简单的排序算法.默认是从小到大排序,即把最大的数据排在最后,相当于 ...

  9. 排序算法:简单选择排序算法实现及分析

    简单选择排序算法介绍 简单选择排序(Simple Selection Sort)就是通过n-1次关键字排序之间的比较,从n-i+1个记录中选择关键字最小的记录,并和第i(1<=i<=n)记 ...

最新文章

  1. VMware vSphere 5.5   和 ESXi 5.5 序列号搭配
  2. 分词 正文提取 java
  3. AppWidgetServiceImpl: Widget Error: widget.host.callbacks is null
  4. C++ 标准模板库(STL)
  5. 【NLP】含10,000 Python问题,伯克利联合团队推出新的代码生成评价基准
  6. postman可以测试websocket吗_小海塔罗娱乐测试2021年可以脱单吗?
  7. [Android Studio] 初体验
  8. 【2016年第6期】数据产品在线定制平台的探索实践
  9. 漫步微积分一 —— 引言
  10. html——影响文档流属性详解
  11. uboot之uboot.lds文件分析
  12. Codeforces Round #296 (Div. 1) E. Triangles 3000
  13. VS Code 实用快捷键
  14. 螺钉螺母匹配问题---快速排序
  15. 计算机学院静态网页毕业论文,静态网页毕业论文静态网页毕业论文.doc
  16. Regex 量词Quantifier 分组group
  17. 磊科linux无线网卡驱动安装步骤,怎么安装磊科nw336无线网卡驱动
  18. 第九届中国云计算大会讲师团探秘 ——数位院士领衔、近20个国家的学者共聚、多个行业领头人及专家参与, 共话云计算大数据生态、应用...
  19. 读取本地文件转化成MultipartFile
  20. 搜索引擎介绍系列——数据采集

热门文章

  1. android apk瘦身方法
  2. 中国美术家协会吴冬梅的工笔人生
  3. Window bat批处理命令
  4. Android WorkManager
  5. facenet_pytorch简介
  6. linux vip设置
  7. python天天向上的力量程序代码_天天向上的力量python(举一反三)
  8. 来,设计个微信朋友圈-Feed流
  9. TiDB 4.0 在 VIPKID 的应用实践
  10. 通用技术课件_VIPKID实时计算技术实践