分治问题学习笔记
一.分治策略的思想
分治–分而治之,将某问题,分为n个子问题,对n个子问题逐个击破,再对子问题处理结果进行合并,得到最终问题的解。
二.步骤
分:将问题分成合适个数的子问题(根据问题的规模来考虑子问题的个数,既要考虑到并行计算的 能力,也要考虑结果合并处理的开销);
治:将小规模的子问题逐个击破(这一步可以采用 多线程并行计算提高运算速度);
合:将解决后的子问题进行合并,得到最终问题的解。
三.注意问题
1.分成子问题的数量,需要考虑子问题结果合并的开销;
2.分成的子问题是否独立,子问题之间不包含公共的子子问题,不可以不同的子问题间强联系;
3.原问题是否可以分解,以及分解的合适范围。
四.分治算法应用
1.查找 :二分查找,求最值,大整数乘法等;
2.排序 :合并排序,快速排序等;
3.经典问题 :最接近点对问题,循环赛日程表,汉诺塔问题。
五.应用举例
1.二分排序:
对于给定的List序列,对其从小到大进行排序,得到升序序列
代码实现:
#-*- coding:utf-8 -*-
#Merge函数功能是将子问题进行合并
def Merge(L, R):
i = j = 0
list = []
while(i < len(L) and j < len(R)):
if L[i] <= R[j]: