题目:从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. 该值为最少比较次数。