一.基本概念
在计算机科学中,分治算法(Divide ans conquer ,D&C)是一种基于多分支递归的算法设计范例。“分而治之”,它通过将复杂的问题分解(devide)成两个或多个同类型(或相关类型)的子问题,直至达到能直接解决(conquer)的程度(否则继续分解或递归),最终合并(combine)成原始问题的解来实现分治。
https://en.wikipedia.org/wiki/Divide_and_conquer_algorithms
二.分治法的适用特征
分治法所能解决的问题一般具有以下几个特征:
1) 该问题通过分解(devide)将问题规模缩小到一定的程度就可以容易地解决
2) 该问题分解为的若干个规模同类型(或相关类型)的子问题具有最优子结构性质。
3) 利用该问题分解出的子问题的解可以合并为该问题的解;(不具备,可以考虑贪心(greedy algorithm)或者动态规划(DP))
4) 该问题所分解出的各个子问题是互斥的,即子问题之间不包含公共的子子问题。(若有,动态规划更优(DP))
三.分治法的基本思想与步骤
在分治策略中,在每个层次递归中应用了三个步骤:
1.分解(Divide):将P分解为较小的子问题 P1 ,P2 ,...,Pk
2.解决(Conquer):
If Pi is enough small to solve, thensolve.(直接解决)
Else for i←1 to k,do yi ← Divide-and-Conquer(Pi)△递归解决Pi
3.合并(Combine): T ← MERGE(y1,y2,...,yk)△合并子问题, return(T)
子问题足够大需要递归时,称递归情况(recursive case)。足够小可以直接解决,递归“触底”,称基本情况(base case)。如果除了与原问题形式完全一样的规模更小的子问题外,还需求解不一样的子问题,将其看做合并。
递归与分治紧密相关,递归式很容易刻画分治算法的时间复杂度。一个递归式是一个等式或者不等式,通过更小的输入上的函数值来描述。
通常,解决这类问题(一直递归式,找答案)有三种方法:
1) 数学归纳法(Mathematical Induction)
2) 递归树找规律(Recursion Tree)
3) 主定理(Master Theorem)
四.分治法的复杂性分析
一个分治法将规模为n的问题分成k个规模为n/m的子问题去解。设分解阀值n0=1,且adhoc解规模为1的问题耗费1个单位时间。再设将原问题分解为k个子问题以及用merge将k个子问题的解合并为原问题的解需用f(n)个单位时间。用T(n)表示该分治法解规模为|P|=n的问题所需的计算时间,则有:
T(n)= k T(n/m)+f(n)
通过迭代法求得方程的解:
递归方程及其解只给出n等于m的方幂时T(n)的值,但是如果认为T(n)足够平滑,那么由n等于m的方幂时T(n)的值可以估计T(n)的增长速度。通常假定T(n)是单调上升的,从而当 mi≤n<mi+1时,T(mi)≤T(n)<T(mi+1)。