Divide and Conquer(分治法):
1. Divide: the problem(instance) into one or more subproblems.(把问题分解成一个或多个子问题)
2. Conquer: each subproblem recursively.(递归的解决每个子问题)
3. Combine: solutions.
Ex1: Merge Sort (归并排序)详细的归并排序介绍http://blog.csdn.net/touch_2011/article/details/6785881
1. Divide : two halves (the left and the right)
2. Conquer: recursively sort each subarray.
3. Combine: merging two subarray.
Running Time :
总时间 = 分解时间(Divide Time) + 解决问题时间(Conquer Time) + 合并时间(Combine Time)。
(1) 分解时间就是把一个待排序序列分解成两序列,时间为一常数,时间复杂度O(1).
(2) 解决问题时间是两个递归式,把一个规模为n的问题分成两个规模分别为n/2的子问题,时间为2T(n/2).
(3) 合并时间复杂度为O(n)。
总时间:T(n) = 2T(n/2) + Θ(n) --> T(n) = Θ(nlgn) (use master method computing)
Note:使用主方法计算,算法导论 page 50有详细介绍
Ex2: Binary Search 二分查找
Question:find x in sorted array
1. Divide: compare x with middle
2. Conquer:find x in one subarray recursively
3. Combine: trivial(do nothing)
Running Time: Divide Time = Θ(1); Conquer Time = T(n/2) 只在一边继续找,另一边丢掉
T(n) = T(n/2) + Θ(1) --> T(n) = Θ(lgn)
Ex3: Powering a number
Question: give a number x, integer n>=0, compute x^n
Naive algorithm : x*x*x...*x,T(n) = Θ(n)
Divide and Conquer : (1) n is ever(偶数) : x^n = x^(n/2)*x^(n/2)
(2) n is odd (奇数) : x^n = x^((n-1)/2)*x^((n-1)/2)*x
Running Time : T(n) = T(n/2) + Θ(1) --> T(n) = Θ(lgn)
Ex4: Fibonacci Numbers 斐波那契数
Question:compute f(n),f(n) = f(n-1) + f(n-2),f(1) = f(2) =1
Naive algorithm: recursively
Running Time : Ω(φ^n) 指数级
Divide and Conquer : recursive aquaring
Thm:
Running Time : Θ(lgn)
Ex5: Matrix multiplication
Question : Input: A = [aij] B=[bij] i,j = 1,2,3...n
Output: C = [cij] = AB , cij = ∑aik*bki (k:1 to n)
Standard : Θ(n^3)
pseudocode(伪代码) : for i <- 1 to n
for j <- 1 to n
do for k <- 1 to n
do cij <- aik*bki
Divide and Conquer : Block form the matrix 矩阵分块
Idea : n*n matrix of (n/2)*(n/2) sub matrixes.
Running Time : (如下图,8次子矩阵乘法,4次子矩阵加法)
T(n) = 8T(n/2) + Θ(n^2) = Θ(n^3) (这个并没有比暴力解法快)
* Strassen's algorithm (比上述方法稍快一点点)
http://www.ituring.com.cn/article/17978
Ex6 : VLSI Layout
Problem : Embed a compute binary tree on n leaves in a grid with minimum area.
Result : H型排列比完全二叉树排列更节省面积
完全二叉树排法:长W(n) = 2W(n/2) + O(1) = Θ(n)
高H(n) = H(n/2) + O(1) = Θ(lgn)
Area(n) = Θ(nlgn)
如果想比这种排法更节省面积,复杂度期望达到Θ(n),Θ(n) = Θ( sqrt(n) )*Θ( sqrt(n) )
H型排列: 长和高相等 L(n) = 2L(n/2) + Θ(1) = Θ( sqrt(n) )
Area(n) = Θ(n)