找到n个元素中的第二小元素

算法导论中的一道习题:

证明: 在最坏情况下,找到n个元素中的第二小的元素需要n+ceil(lgn)-2次比较。(提示:可以同时找到最小元素,ceil表示向上取整)

思路:

找到最小元素需要n-1次比较。采用两两结合比较的方法。如果n为奇数,则取第一个元素为临时最小元素min,其它两两结合比较,形成一个类似树的比较过程。如果n为偶数,则直接进行两两结合比较,根节点即为最小元素。

接下来查找第二小元素,需要ceil(lgn)-1次比较。考虑:第二小元素一定和第一小元素进行了比较,所以可以直接在比较树的根节点到叶节点中的元素中去寻找,当n为2^n时,树高为floor(lgn)。否则,树高为ceil(lgn), 需要比较次数为floor(lgn)-1或ceil(lgn)-1     (ps:此处为何只是ceil(lgn)  没搞明白。。。)

这样就可以得到一个与结论很接近的一个结果。

那么,我们发散一下思维,最坏情况下是上面的结果,那么最好情况下呢?

思路:

“设定两个存储单元:N1,N2,N1中保存最小的两个中较大的一个,N2中保存最小的一个。

假设前两个数是最小的,比较这两个数,将小的放在N2中,大的放在N1中。

从第三个开始循环与N1比较,如果当前比较的值大于N1的值,则继续循环直到最后。如果当前比较的值小于N1的值,则与N2做比较,如果大于N2则用当前值替换N1的值,如果小于N2,则用N2的值替换N1的值,当前值替换N2的值。

这样做法应该是比较最少的了,最少比较:N-1次,最多比较:2N-3次。”

思路有限,如果你有好的想法,请指教!谢谢~

参考:http://bbs.csdn.net/topics/10428265

时间: 2024-10-13 01:33:42

找到n个元素中的第二小元素的相关文章

sort和sorted深入理解----引子:多维列表,如何实现第一个元素升序,第二个元素降序

一.列表内建方法--sort() 作用:就地对列表排序(直接在原列表上做排序) 语法: list.sort(func=None, key=None, reverse=False) 当reverse=False时:正向排序:当reverse=True时:逆向排序.默认为False. 执行完后会改变原来的list,如果你不需要原来的list,这种效率稍微高点 该方法没有返回值 例子: >>> arr = [2,8,4,6,9,1,3] >>> arr.sort() >

二叉树中序遍历迭代解法——求解BST中第k小元素

飞艇公式规律[一对一教导扣2901583663][长久盈利轻松上岸]胜率95%,已助上千人成功翻盘,欢迎增加,沟通交流!如果你没过硬的基础,没有专业计划,没有实际规划,而是盲目**的话,注定你就在亏钱,但是如果是有计划有规律有规划的话就另当别论,可以说是投资,往往稳定心理的投资是有稳定的回报的.简单总结以下几点:1.资金投资要讲究,合理分配是可以得到回报的.2.玩法要专一,往往一在你换掉之前的玩法的时候就出了.3.心理要稳定,该出手就出手,别犹犹豫豫的,那样会把你给拖垮的.4. 别去依赖什么必胜

css选择器指定元素中第几个子元素

tr td:nth-child(2){ background-color:gray; } 就是tr当中的td的第二个td的属性 tr:nth-child(2n+0){ background-color:#F0F0F0; } 这个是tr的2的倍数的 使用公式 (an + b).描述:表示周期的长度,n 是计数器(从 0 开始),b 是偏移值. 在这里,我们指定了下标是 3 的倍数的所有 p 元素的背景色: p:nth-child(3n+0) { background:#ff0000; }

通过css 实现元素中单行内容超出元素宽度,以省略号代替超出内容 效果

css如下: width: **px; // text-overflow: ellipsis; overflow: hidden; white-space: nowrap;

LeetCode 671. 二叉树中第二小的节点(Second Minimum Node In a Binary Tree) 9

671. 二叉树中第二小的节点 671. Second Minimum Node In a Binary Tree 题目描述 给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0.如果一个节点有两个子节点的话,那么这个节点的值不大于它的子节点的值. 给出这样的一个二叉树,你需要输出所有节点中的第二小的值.如果第二小的值不存在的话,输出 -1. 每日一算法 2019/5/12Day 9 LeetCode671. Second Minimum Node In a B

671. 二叉树中第二小的节点

给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0.如果一个节点有两个子节点的话,那么这个节点的值不大于它的子节点的值. 给出这样的一个二叉树,你需要输出所有节点中的第二小的值.如果第二小的值不存在的话,输出 -1 . 示例 1: 输入: 2 / \ 2 5 / \ 5 7 输出: 5说明: 最小的值是 2 ,第二小的值是 5 来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/second-minimum-n

HDU 2561 第二小整数

第二小整数 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10766    Accepted Submission(s): 6548 Problem Description 求n个整数中倒数第二小的数.每一个整数都独立看成一个数,比如,有三个数分别是1,1,3,那么,第二小的数就是1. Input 输入包含多组测试数据.输入的第一行是一

第二小整数

Problem Description 求n个整数中倒数第二小的数.每一个整数都独立看成一个数,比如,有三个数分别是1,1,3,那么,第二小的数就是1. Input 输入包含多组测试数据.输入的第一行是一个整数C,表示有C测试数据:每组测试数据的第一行是一个整数n,表示本组测试数据有n个整数(2<=n<=10),接着一行是 n个整数 (每个数均小于100); Output 请为每组测试数据输出第二小的整数,每组输出占一行. Sample Input 2 2 1 2 3 1 1 3 Sample

CSS中2d转换:transition过渡放在:hover伪类中与应用在整个元素中区别

css的2d转换十分强大,能够在不使用js的情况下,实现页面的元素与用户之间更多动态的交互,增强用户体验.其中使用最多的就是hover伪类. 1.创建一个页面的div元素: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>2d转换测试</title> </head> <body> <div id="fr&