分治算法

1. 简介

1.1 主要思想:

将原问题递归的分成若干的子问题,直到满足边界条件停止递归,将子问题解决(同种方法),然后合并子问题,最后,算法层层合并得到答案。
即: 分、治、合。

1.2 适用范围:

分治法所能解决的问题一般具有以下几个特征:

1) 该问题的规模缩小到一定的程度就可以容易地解决

2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。

3) 利用该问题分解出的子问题的解可以合并为该问题的解;

4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。

1.3 基本设计模式

Divide-and-Conquer(P)

    1. if |P|≤n0

    2. then return(ADHOC(P))

    3.P分解为较小的子问题 P1 ,P2 ,...,Pk

    4. for i←1 to k

    5. do yi ← Divide-and-Conquer(Pi) △ 递归解决Pi

    6. TMERGE(y1,y2,...,yk) △ 合并子问题
    7. return(T)

     其中|P|表示问题P的规模;n0为一阈值,
     表示当问题P的规模不超过n0时,问题已容易直接解出,不必再继续分解。ADHOC(P)是该分治法中的基本子算法,用于直接解小规模的问题P。
     因此,当P的规模不超过n0时直接用算法ADHOC(P)求解。算法MERGE(y1,y2,...,yk)是该分治法中的合并子算法,
     用于将P的子问题P1 ,P2 ,...,Pk的相应的解y1,y2,...,yk合并为P的解。

2 算法实践

2.1 排序算法

解题思路: 分,治 ,合。
边界条件即数组中只有一个数字
分:将数组进行拆分,直到数组中只有一个元素。
治:层层递归将有序的数组进行排序。例如最开始只有一个数组[1],[5] .即对两个有序的数组进行排序。
合:将两个数组合并成一个有序数组,

def mersort(nums):
   
    if not nums:
        return
    if len(nums)==1:
        return nums
       
    mid = len(nums) // 2
    leftnums=mersort(nums[:mid])
    rightnums=mersort(nums[mid:])

    # 治理
    result=sortc(leftnums,rightnums
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值