选第二大元素python(分治)

给定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函数:接收最大值淘汰的元素列表,顺

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值