分治算法

算法学习之分治算法

    • 1. 简介
      • 1.1 主要思想:
      • 1.2 适用范围:
      • 1.3 基本设计模式
    • 2 算法实践
      • 2.1 排序算法
      • 2.2 最大子序列和
      • 2.3 二分查找
      • 2.4 快速排序
      • 2.5 汉诺塔
      • 2.6 递归乘法
    • 3 常见使用场景的算法

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)
    return result

def sortc

你可能感兴趣的:(算法学习,分治算法)