算法学习之分治算法
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. T ← MERGE(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