算法导论(第三版)习题解答9.1-1(找第二小的元素)
来源:互联网 发布:ubuntu 脚本使用教程 编辑:程序博客网 时间:2024/05/19 22:06
我们做出如下断言:无论采用何种比较算法,第二小的元素在我们找寻最小元素的过程中一定与最小元素发生过比较。
这是显然的,因为第二小元素在与除最小元素外的其他任何元素进行比较时一定都会胜出(被选中进入下一轮比较),若最小元素不与第二小元素进行比较则无法确定二者之间的大小关系,从而无法得出最小值。
因而,要想使我们找到第二小的元素使用的比较次数尽量少,我们需要使找寻最小元素的过程中与最小元素发生过比较的元素尽量少。
由于每次我们只能取两个数进行比较,从而考虑每一轮比较我们将待比较元素两两分组比较,较小的元素进入下一轮继续比较(若总元素个数为奇数,落单的元素直接进入下一轮比较),这样比较所得的与最小元素比较过的元素是最少的(每一轮只有一个)。
我们将比较过程组织成一棵二叉树(以数组1 3 2 5 6 7 4为例):
其中,每一个结点都是其两个子结点比较所得结果。在树的每一层只有一个元素与于最小元素比较(除第一层外)。该比较算法中比较次数等于树中度为2的结点个数,由二叉树的性质可知,该二叉树找寻最小元素对应的比较次数为n-1次(二叉树中:度为2的结点个数=度为零的结点个数-1)达到了下界,从而是最优的。可以看出,与最小元素比较的元素个数=树高h-1。又叶节点个数为n从而有2^(h-1)>=n,故有h-1=ceil(lgn)即与最小元素比较的元素个数至少为ceil(lgn)。
从这ceil(lgn)个元素中找到最小元素即为第二小元素。最坏情况下,在第一轮比较中,第二小元素与第一小元素比较而被淘汰,从而在得到最小元素的过程中,我们无法得到其余任何元素与第二小元素的大小关系。在这种情况下,要找出这ceil(lgn)个元素中的最小元素需要ceil(lgn)-1次比较。
综上,最坏情况下,找出第二小元素所需的比较次数为n-1+ceil(lgn)-1=n+ceil(lgn)-2。
- 算法导论(第三版)习题解答9.1-1(找第二小的元素)
- 【算法导论(第三版)】第二章部分习题代码
- 算法导论第三版4.1习题解答
- 算法导论 9.1-1 求第二小元素 (这篇文章写的很好转来学习)
- 算法导论 9.1-1 求第二小元素
- 算法导论 9.1-1 求第二小元素
- 算法导论 9.1-1 求第二小元素
- 算法导论 9.1-1 求第二小元素
- 算法导论(3版)第4章习题的部分解答
- 算法导论(3版)第5章少量习题的解答
- 算法导论第三版习题32-1
- c++ primer第五版(中文)习题答案 第十章第二节第三小节-重排容器元素的算法
- 算法导论课后习题第二章(1)
- 【算法导论(第三版)】第四章部分习题代码
- 关于《算法导论(第三版)》的课后作业7.4-5的解答
- 算法导论习题15.5-1解答
- 《算法导论》习题解答 Chapter 22.1-3(转置图)
- 算法导论第二章部分习题自我解答
- 栈
- [jQuery知识]jQuery之知识三-过滤器
- Jetty集成Resteasy发布rest服务Demo
- 概念笔记之[javascript<-2->]闭包和封装
- 12.06
- 算法导论(第三版)习题解答9.1-1(找第二小的元素)
- 重新上路
- 二.如何在批处理文件中使用参数
- nodejs 连接mongodb
- as-conformal-as-possible discrete volumetric mapping
- Kafka集群操作指南
- 三.如何使用组合命令(Compound Command)
- java web实现img读取盘符下的图像
- poj 2524Ubiquitous Religions (并查集)