python算法之分治算法

基本思想

当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。这就是分治策略的基本思想。

我的理解就是“分而治之”,将一个大问题分解成若干个子问题,一般情况下分为2个,然后将分解后的且已经解决的各块合并,求解

案例一

求顺序表的最大值

import time
def get_max(List):
    A=max(List)
    return A

def get_fz(List):
    n=len(List)
    if n<=2:    #若问题模块小于或等于2
        return get_max(List)
    #分解子问题模块
    left_list,right_list=List[:n//2],List[n//2:]
    
    #递归,分治
    left_max,right_max=get_fz(left_list),get_fz(right_list)
    return get_max([left_max,right_max])
    

if __name__ == '__main__':
    num=[i for i in range(1000)]
    s_1=time.time()
    print(get_fz(num))

案例二

判断某个元素是否在列表中

def is_in_list(List,n):
    return [False,True][List[0]==n] #判断为真返回True,为假返回False

def solve(List,N):
    n=len(List)
    if n==1:
        return is_in_list(List,N)
    #分解,子问题规模没n/2
    left_list,right_list=List[:n//2],List[n//2:]
    #递归,分治,合并
    res=solve(left_list,N) or solve(right_list,N)
    return res
if __name__ == '__main__':
    List1=[i for i in range(10)]
    print(solve(List1,22))
    print(solve(List1,3))

案例三

找出一组序列中最小的值

def partition(seq):
    pi=seq[0]
    lo=[x for x in seq[1:] if x<=pi]
    hi=[x for x in seq[1:] if x>pi]
    return lo,pi,hi
def select(seq,k):
    #分解
    lo,pi,hi=partition(seq)
    m=len(lo)
    if m==k:
        return pi
    elif m<k:
        return select(hi,k-m-1) #递归,分治
    else:
        return select(lo,k) #递归分治
if __name__ == '__main__':
    List2=[i for i in range(20)]
    #查找
    print(select(List2,4))
    print(select(List2,6))  #从0开始

可以关注微信公众号,免费获取学习资源,每周都有更新
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值