给定n个元素,找出元素中的第二大元素。该问题如果用线性扫描的方法的话,
首先找出最大值,比较n-1次
然后从n-1个元素中找出最大值,比较n-2次
下面考虑设计一个选第二大元素的分治算法
1.将n个元素从中间一分为二
2.递归两个子问题,分别求出两个子问题的最大值,同时将被淘汰的较小元素记录在较大元素的列表中。在最大值的淘汰元素列表中找第二大元素。
实现
用字典存储被较大元素淘汰的元素,每个元素的key是给定的n个元素,value是一个列表,包括所有被该元素淘汰的元素
1.首先定义一个find_max()函数,实现第一阶段的操作:接收n个元素的列表a_list,要查找的问题的边界left和right。输出n个元素的最大值,同时将被淘汰的元素插入到字典相应key的value中
def find_max(arr,left,right):
global dic
if left>=right:
return arr[left]
mid=(left+right)//2
left_max=find_max(arr,left,mid)
right_max=find_max(arr,mid+1,right)
if left_max>right_max:
dic[left_max].append(right_max)
return left_max
else:
dic[right_max].append(left_max)
return right_max
2.定义find_max函数:接收最大值淘汰的元素列表,顺