我们知道,在一个容量为n的数据集合中寻找一个最大数,不管用什么样的比较算法,至少要比较n-1次,就算是用竞标赛排序也得比较n-1次,否则你找到的就不能保证是最大的数。那么,在一个容量为n的数据集合中同时寻找最大数和最小数的最小比较次数是多少呢?
     从一个容量为n的数据集合中同时找到最大数和最小数的最优方法是:首先让所有的元素参与两两比较,这样总共比较了n/2次,最大数肯定在胜者组中,最小数肯定在败者组中;然后从容量为n/2的胜者组中找到最大的数,最少要比较n/2 - 1次;同理,从容量为n/2的败者组中找到最小的数,最少要比较n/2 - 1次。所以总共需要比较 (3n/2) - 2次。以上假设n为偶数。奇数同理。

这是同时寻找最大数和最小数的最优算法。

那么,我们要从一个容量为n的数据集(假设该数据集是一个集合,即没有相同的元素)中找到第二大元素需要多少次比较呢?
    一种习惯的方法是:先找出最大的元素,这需要比较n-1次;然后从剩下的n-1个元素中找到最大的,这个元素就是我们要找的第二大元素,这需要比较n-2次。做一总共比较2n-3次。
但是,
    还有一个更优的方法:
(1) 我们考虑淘汰赛的比较法,淘汰赛结束后,找出冠军我们需要n-1次比较;如下图所示,找到12需要比较7次。
(2) 此时我们要考虑到,亚军应该存在于败给冠军的这些选手中(否则,每个元素都至少有两个元素比它大),由于与冠军比过的元素个数为┌log2n┐,从这些元素中找到最大值需要比较┌log2n┐ - 1次;如下图所示,亚军应该在10,11,4这三个元素中。否则,如果亚军是5,那么冠军12比它大,与它比较过的10也比它大,至少两个元素大于5,所以5肯定不是亚军的候选者。

(3)从而找出亚军要比较n-1+┌log2n┐-1 = n-2+┌log2n┐次比较。这个算法是寻找亚军的最优算法。

分治与递归——最大值和次大值的最优算法

问题描述:输入n个数,最坏情况下用 n + logn - 2 次比较找出当中的最大值和次大值。

算法思想:根据题意出现logn,则肯定用到二分或者堆的思路,但是输入的数没有经过排序,而且题目要求的计算量也不允许排序。这样,就肯定会用到类似堆的思路,但是直接构造堆等同于排序。堆的思想跟竞标赛类似,都是父节点>=(<=)子节点。如果父节点都是从子节点而来,这样就是竞标赛;如果不是,这样就是堆。既然不能排序又不能构造堆,那就只能用竞标赛的思想,通过二分来进行最多logn次竞赛,选出最大值(冠军),而次大值(亚军)只能在与最大值的比较中被淘汰(亚军的实力只可能输给冠军),故在所有被最大值(冠军)淘汰的数值中选取次大值,最多也是logn次比较,满足题意(由于题意只限制了比较次数,故实现过程并没有考虑时间复杂度和空间复杂度)

代码实现:

//最大值和次大值的最优算法,数组中可能存在重复元素,不能处理最大值是0的情况

#include <stdio.h>

#define N 1000

int m[2*N];

int num[2*N];

int biaoji[N];

int bigger(int i)

{

if(num[i]>num[i+1])

{

biaoji[m[i+1]]=num[i];

return i;

}

else

{

biaoji[m[i]]=num[i+1];

return i+1;

}

}

int work(int a,int b)

{

int i,j;

while(a<b)

{

for(i=a;i<b;i+=2)

{

j=bigger(i);

num[i/2]=num[j];

m[i/2]=m[j];

}

if(i==b)

{

num[i/2]=num[i];

m[i/2]=m[i];

}

a=a/2;

b=b/2;

}

return num[a];

}

int work2(int l,int max)

{

int i,flag=1;

int bmax;

for(i=l;i<2*l;++i)

{

if(biaoji[i-l]==max)

{

if(flag)

{

flag=0;

bmax=num[i];

}

else if(bmax<num[i])

bmax=num[i];

}

}

return bmax;

}

int main()

{

int i,l;

int max,bmax;

int f,start;

while(true)

{

printf("please putin the length:\n");

scanf("%d",&l);

if(l==0)

break;

printf("please putin num[]:\n");

for(i=l;i<2*l;++i)

scanf("%d",&num[i]);

for(i=l;i<2*l;++i)

m[i]=(i-l);

max=work(l,2*l-1);

bmax=work2(l,max);

printf("the max is %d and the bmax is %d\n",max,bmax);

}

return 0;

}

同时寻找最大数和最小数的最优算法 第二大数相关推荐

  1. 快速找出一个数组中的最大数、第二大数

    http://blog.csdn.net/hackbuteer1/article/details/8035261#comments 快速找出一个数组中的最大数.第二大数 思路:如果当前元素大于最大数 ...

  2. [基础题]1.快速找出一个数组中的最大数、第二大数。

    [基础题]1.快速找出一个数组中的最大数.第二大数. package HomeWork_10;public class Test_01 {public static void main(String[ ...

  3. python求一组数的最大值_用python实现在一组数据中,寻找到最大数和最小数并输出最大数和最小数所在的位置...

    题目 定义一个实数数组,数组的元素个数不低于十个,且存在重复的最大值和最小值. (1).编写python程序用for循环或while循环找出这些数中的最大数和最小数: (2).找出最大数和最小数的在改 ...

  4. 用python实现在一组数据中,寻找到最大数和最小数并输出最大数和最小数所在的位置

    题目 定义一个实数数组,数组的元素个数不低于十个,且存在重复的最大值和最小值. (1).编写python程序用for循环或while循环找出这些数中的最大数和最小数: (2).找出最大数和最小数的在改 ...

  5. 对整个矩阵元素进行计算:最大数、最小数、排序

    matlab的最大数和最小数,当然就是max和min了,这个大小都很清楚.但是这两个函数(其实还有一类这样的函数,比如sort)都有一个特点:都是以列为单位进行计算的. 下面的例子可以说明 >& ...

  6. C语言实例第4期:交换数组中最大数和最小数的位置

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  7. nyoj1057寻找最大数3

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=1057 或者:http://115.159.40.116/problem_show.php ...

  8. nyoj 寻找最大数

    寻找最大数 描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=92081346718538,m=10时,则新的最大数是9888 输入 第一行输入一个正整数T,表示 ...

  9. 如何快速找出一个数组中最大数和第二大数

    看到一道题是:快速找出一个数组中最大数和第二大数. 我之前学了一些数组排序,例如冒泡排序,简单选择排序等等,然后我就想可不可以利用冒泡排序来实现呢?之前写过冒泡排序实现从小到大的排列,那么可以改成从大 ...

最新文章

  1. 石头机器人拖地水量调节_石头扫地机器人T7上手体验:电控水箱和超大容量,扫拖一体全能型...
  2. 大专生如何报考MBA
  3. Spark记录-Scala基础语法
  4. python和c语言相通吗_python和C语言互相调用的几种方式
  5. CF735D-Taxes【数学,数论】
  6. C/C++输入输出流
  7. 查表法实现反正切_关于python实现CRC32的应用和总结
  8. linux san网络,rhel5 – 使用Linux时,为什么我的MPIO连接到SAN的上限为1 Gbps?
  9. 【POJ1064】Cable master(二分搜索+浮点判断处理)
  10. JS根据身份证计算年龄
  11. 如何删除Word文档中的空白页
  12. 小程序报错提示Unexpected token in JSON at position
  13. 清除电脑缓存的bat文件
  14. linux OS与SQL修改时区,系统时间
  15. c语言error语句错误,【资料】C语言错误信息中文解释
  16. java 红外光谱数据库_免费的谱图数据库20个 - 晶体 - 小木虫 - 学术 科研 互动社区...
  17. 【新手入门必看】MaixPy 图像基础知识
  18. Visual Studio 2008 (vs 2008)简体中文专业版、团队版及SP1下载地址
  19. 2021-06-27 .NET高级班 71-ASP.NET Core Identityserver4(OAuth2.0模式)
  20. 近3千多道小学语数英知识题ACCESS数据库

热门文章

  1. 【转】禁用Chrome和Firefox中自动播放的动画GIF
  2. 【转】WPF从我炫系列4---装饰控件的用法
  3. 【转】.Net中的异步编程总结
  4. log4net部分配置说明
  5. 【转】WOPI host消息体结构
  6. stick和stuck的区别_怎样区别“stick to”、“stick with”和“stick by”这三个表达?...
  7. 【微软官方文档】Windows终端(Windows Terminal)
  8. 计算机教室管理责任书,计算机教室管理安全责任书.doc
  9. 【HDU - 5477】A Sweet Journey(思维,水题)
  10. 自定义函数删除字母C语言,[编程入门]自定义函数之字符提取-题解(C语言代码)...