最小比较次数问题的通用解法

题目:从N个无序数中找到最大数(或者:最大数和最小数、最大的前K个数),需要的最小比较次数。

思路:用递归公式。设N个数所需要的比较次数为F(N), 将比较过程划分成更小的部分。求递推公式的解。

划分的第一步永远是:分成N/2组一对一比较,形成两大阵营:胜者组败者组

题目一:从N个无序数中找到最大数

先分成N/2个胜者和N/2个败者,需要N/2的比较次数。然后从N/2规模的胜者组中找到最大值即可(即单淘汰制度)。这是一个递归关系:F(N)=N/2+F(N/2). 求解该方程可以得到:F(N)=N/2+N/4+N/8+...+1=N-1.

(因为无穷级数N/2+N/4+N/8+...=N,而该无穷级数从1之后的部分是1/2+1/4+1/8+...=1,所以N/2+N/4+N/8+...+1=N-1. )

即共需要N-1次比较。

题目二:从2N个无序数中同时找到最大值和最小值

先分成N个胜者和N个败者,需要N的比较次数,然后从N规模的胜者组中找到最大值,需要N-1次(题目一已经解出),从N规模的败者组中找到最小值,根据对称性也是N-1次,则由F(2N)=N+N-1+N-1=3N-2次比较。

题目三:从N个无序数中找到最大值和次大值

先分成N个胜者和N个败者,需要N的比较次数,然后从N/2规模的胜者组中找到最大值和次大值,需要F(N/2)次比较。再找到最大值对应的败者组里的对手,不需要比较次数,最后让胜者组的次大值和败者组里找出的该值比较,需要一次。所以有F(N)=N/2+1+F(N/2).

解出F(N)=(N/2+N/4+N/8+...+1)+(1+1+1+..+1(共logN-1个1))=N-2+logN. 该值为最少比较次数。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值