求解第二大元素——锦标赛算法(Tournament Algorithm)

问题

给定一个长度为n的数组arr,请用比较次数小于2n的算法求出数组中的第二大元素。

求解

看到题目中的比较次数小于2n就知道不能先用一次循环找出最大元素,接着利用最大元素再一次循环找到第二大元素。

那么,应该怎么解决呢。这时就需要用到我们的锦标赛算法(Tournament Algorithm)了。该算法的主要思想就是让长度为n的数组中的元素两两一组,一共分成n/2组,每一轮都是这样分;每一轮都将两两比较中较大的留下来,较小的就直接丢弃;因此每轮过后元素都会少一半;经过log_2n-1后留下一个数,那个数就是最大的数;那么怎么寻找第二大的数呢?我们发现,在淘汰的过程中,最大的数肯定和第二大的数见过面(也就是比较过)。因此,我们只需在淘汰的过程中为每一个数建立一个链表,把被淘汰的数放到留下的数的链表的表尾;当我们找到最大的数的时候,只需将最大的数的链表中最大的数取出来就得到了第二大的数了。

由于从n个元素淘汰到只剩一个元素需要比较n-1次;寻找第二大元素需要比较\left \lceil log_2n\right \rceil-1次;因此其时间复杂度为n+\left \lceil logn \right \rceil-2

下面是手稿演示图:

猜你喜欢

转载自blog.csdn.net/qq_55126913/article/details/129738509
今日推荐