面试算法题:16个数,最多用20次比较,找出第二大的数?

利用二分法在20次比较内找出第二大的数
本文介绍了如何在有限的比较次数内,通过二分法策略,有效找出一组数中的第二大的数。首先,通过两两比较筛选出最大数,并在此基础上进一步分析第二大数可能存在的位置,最终得出结论需要18次比较即可完成目标。

这道题最笨的方法就是先从16个数中选出最大的数,然后再从剩下的15个数中选出最大数就可得到答案,因此,需要15+14=29次比较。

既然这道题要求在20次比较之内就能找出第二大的数,那我们就想能简单的方法。

假设16个数中最大的是A,第二大的是B。

首先将16个数两两进行比较,较大者胜出,然后再在胜出者中进行两两比较,按此方法,最后选出最大数A,如下所示

红色路线是最大数经过的路径。

 

接下来分析B可能存在的位置。

将16个数分为左部分和右部分各8位:

1、如果A和B在两个不同的部分(A在左部分,B在右部分,则B是右部分的最大者),因此按照上面的比较方法,B将在根节点的右子节点,即图中红色1节点;

2、如果A,B处于同一个部分(假设都在左部分,如果同在右部分,分析方法一样),则在左部分的8个节点中,按照方法1继续划分查找;

通过这种方式分析可以知道,A和B一定会做一次比较(想想为什么)。在图中,如果A按照红色路线上升,则B可能出现的位置就是红色节点1,2,3,4。

四个红色位置比较要3次。

因此最终需要:

8+4+2+1+3=18

 

 

转载于:https://www.cnblogs.com/LCCRNblog/p/4354724.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值