Introduction of Algorithm - Divide and Conquer(分治法)

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)



 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值