`

找出具有n个元素的集合中最大的两个元素,要求比较次数尽可能少(三种算法的思考)

 
阅读更多

http://blog.csdn.net/will_lee_buaa/article/details/12884989

题目:给定具有n个元素的集合,找出最大的两个元素,算法要求比较次数尽可能少

 

这个题目要做出来很简单,但是要找出比较次数尽可能少的算法也不是件容易的事情。

对于这个题目,目前有三种方法比较流行。

第一种:对集合扫描两遍(当然也可以扫描一遍,同时最大和第二大元素,但花费的比较次数和扫描两遍,在最坏情况下是一样的),第一遍找出最大的元素,第二遍从剩余的元素中找出最大的元素,即整个集合的第二大元素。两遍扫描需要的比较次数为2*n-3次

 

第二种:将集合每两个元素一组,分成n/2组,组内两个元素先进行比较,初始化两个元素,max1,max2,代表当前最大和第二大元素,然后从第一组开始,让max1和max2,依次和每组进行比较,并更新max1和max2,得到最终的整个集合的max1和max2。整个过程需要的比较次数为3*n/2次

 

第三种:此种方案,似乎被几乎所有人认为是最好的方案,可是事实却是相反的!下面进行第三种方案的分析:

第一步:将集合每两个元素一组,分成n/2组,组内元素进行比较,选出比较大的那个元素。

第二步:将第一步选出的n/2个元素递归使用第一步的处理方式。直到选出集合中最大的元素。

第三步:从和最大元素比较过的元素中,选出最大的元素即为第二大元素。

从第三步可以看出,我们需要开辟一块空间,在每一步中记录和每一个元素比较过的元素集合。因为,在第二部执行结束之前,我们并不知道最大元素是哪个元素。从第一步和第二步我们可以想象出来,整个比较过程像一棵二叉树,先从n个子节点开始,一层一层比较,一直到根节点(最大元素)。两个子节点的父节点是两个子节点中较大的那个元素。因此我们可以得到和最大元素比较过的元素的个数等于树的高度,即lgn,所以第三步需要的比较次数为lgn-1,而第一步和第二步需要的比较次数为n-1次,所以总的比较次数为n+lgn-2次,似乎比第一种和第二种方案要好些。

但是,第三种方案需要一块内存空间记录和每一个元素比较过的元素,这个内存空间用数组表示是个二维数组(可以用链表等其他数据结构表示,不影响后面的分析结果),A[1..n][1..lgn],由于n是要处理元素的规模,因此,二位数组需要动态申请,并初始化,这需要花费nlgn的时间!!从这里就可以看出来,第三种方案属于捡了芝麻,丢了西瓜!因此,此种方案是不可取的。

我们可以尝试着对第三种方案进行优化,能不能把A[1..n][1..lgn]二维数组优化为一维数组。

我们可以在算法最开始的时候对集合扫描一遍,找到最大元素,这个时候,我们只需要一个大小为lgn的一维数组来记录和最大元素比较过的元素了,但是对集合扫描一遍需要n-1次比较,所以优化后的总的比较次数为2*n+lgn-3次,还是比前两种方案要差!!

 

注:在我们专注于比较次数的时候,忽略了赋值操作,在三种算法中赋值操作的次数不比比较次数要少,但是因为三种算法的赋值操作次数差不多,上面的分析方法就忽略了赋值操作的影响。

 

分享到:
评论

相关推荐

    软件工程之专题十:算法分析与设计

    穷举搜索法是对可能是解的众多候选解按某种顺序进行逐一枚举和检验,并从中找出那些符合要求的候选解作为问题的解。 要解决的问题只有有限种可能,在没有更好算法时总可以用穷举搜索的办法解决,即逐个的检查所有...

    计算机二级公共基础知识

    数据的逻辑结构有两个要素:一是数据元素的集合,通常记为D;二是D上的关系,它反映了数据元素之间的前后件关系,通常记为R。一个数据结构可以表示成:B=(D,R) 其中,B表示数据结构。为了反映D中各数据元素之间的...

    np完全近似算法c语言

    子集和问题的一个示例为,t >.其中S={x1,x2,…,xn}是一个正整数的集合,t是一个正整数.子集和问题判定是否存在S的一个子集S1,使得 =t ...在这种情况下,要找出S的一个子集S1,使得其和不超过t,又尽可能的接近t.

    C#23种设计模式_示例源代码及PDF

    适配器模式: 从而使原本因接口原因不 适配器模式 把一个类的接口变换成客户端所期待的另一种接口, 匹配而无法一起工作的两个类能够一起工作。 适配类可以根据参数返还一个合适的实例给客 户端。 7、BRIDGE —...

    第7章-大数据分析与挖掘技术---大数据基础.pptx

    (2)聚类分析:聚类分析是一种创建数据对象集合的方法,这种数据集合也称为簇(Cluster),聚类分析力求使得同簇成员尽可能相似,异簇成员尽可能相异 (3)关联分析:关联分析是指找出多个事物之间具有的规律性...

    软件测试规范

    2 三.软件测试流程 ............................................................................................................................................ 3 1.软件测试流程图 .......................

    分布式数据库设计.pdf

    分布式数据库设计 分布式数据库设计 DDB设计的两个问题 1)分段 – 分割关系成"段" ;逻辑上 2)分配 – 将段置放到站点 ;物理存储上 ⽬标 – 优化响应时间/吞吐量/费⽤/… 分段元则 假若有全局关系R 被分段为⼦...

    软件工程-判断题.doc

    判断题 B *1.编程序时应尽可能利用硬件特点以提高...容错就是每个程序采用两种不同的算法编写。(X) *1.软件测试的目的是为了无一遗漏的找出所有的错误。(X) 2.软件开发过程越早发现错误,改正错误的代价越高. 4.软件

    计算机程序的正确定义

    程序(program)是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合。  程序(港台称之为程式) program(me)或procedure  chéng xù  概念1.:为进行某活动或过程所规定的途径。  概念2.程序...

    vc++ 应用源码包_1

    压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...

    vc++ 应用源码包_2

    压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...

    vc++ 应用源码包_6

    压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...

    vc++ 应用源码包_5

    压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...

    vc++ 应用源码包_3

    压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...

    vc++ 开发实例源码包

    DOM应用---遍历网页中的元素 如题。 dshowplayer 媒体播放器的实现,实现了VMR7、VMR9、EVR方式。 DSoundManager 实现了声音管理。 Excel文件的导入和导出操作 如题。主要的实现在CMyExcel类中。 expclass_src ...

    【学习机器学习】实验——模型评估与选择

    留出法原理很直观,就是按照设定的比例对原始数据随机划分成两个互斥的集合,注意训练/测试集划分要尽可能保持数据分布的一致性(其实只要是随机分的多数可以保证) 那代码实现,如果调用sklearn真的是一句话就完...

Global site tag (gtag.js) - Google Analytics