分治法(Divide and Conquer)


分治法(Divide and Conquer)

1.定義

對於具備以下特點的問題:

  • 原問題可以分解爲若干個與原問題性質相類似的子問題
  • 問題的規模縮小到一定程度後可方便求出解
  • 子問題的解可以合併得到原問題的解
  • 分解出的各個子問題應相互獨立
    當這類問題較複雜或規模較大時,將它分解爲若干子問題,通過合併子問題的解得到原問題的解。

2.適用條件分析

分治法所能解決的問題一般具有以下幾個特徵:

  1. 該問題的規模縮小到一定的程度就可以容易地解決
  2. 該問題可以分解爲若干個規模較小的相同問題,即該問題具有最優子結構性質
  3. 利用該問題分解出的子問題的解可以合併爲該問題的解
  4. 問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子問題

上述的第一條特徵絕大多數問題都可以滿足,第二條是分治法應用的前提,反映了遞歸思想的應用,
第三條特徵是關鍵,如果具備了第一條和第二條特徵,而不具備第三條特徵,則可以考慮貪心算法
或動態規劃算法;第四條特徵涉及到分治法的效率,如果各個子問題不是獨立的,則分治法要重複
地解公共子問題,動態規劃算法解決效率更高。動態規劃法=分治算法思想+解決子問題冗餘情況

3.步驟

  • 分解
  • 求解子問題
  • 合併子問題的解

應用1:歸併排序

步驟

  • 把具有n個元素的數組分解爲二個n/2大小的子數組
  • 遞歸地分解子數組,直到子數組只包含一個元素爲止
  • 合併已排好序的子數組使之成爲一個新的排好序的子數組,重複合併直到得到原問題的解

算法

算法分析

應用2:快速排序

基本思想

在當前的無序區A[p…r]中任取一個元素x作爲比較的基準,並用該基準將當前無序區分爲左右二個
較小的無序區A[p…q-1]和A[q+1…r],使得左邊的無序區A[p…q-1]中的元素均小於基準元素x,
右邊的無序區A[q+1…r]中的元素均大於x。

算法

quicksort(A,p,r)
	if p<r
    q=patition(A,p,r)
	  quicksort(A,p,q-1)
    quicksort(A,q+1,r)

partition(A,p,r)
	x=A[r]
	i=p-1
	for j=p to r-1
  	if A[j]≤x
  		i=i+1
  		exchange(A[i],A[j])
	exchange(A[i+1],A[r])
	return i+1

算法分析

partition算法時間爲: θ(n) --> Quicksort的時間:T(n) = T(q)+T(n-q-1)+ θ(n)
最壞情況:二個無序區的大小分別爲n-1和0,T(n) = θ(n^2)
最好情況:O(nlgn)

參考

《算法導論》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章