基本介紹
- 分治法是一種很重要的算法。
字面上的解釋是“分而治之”,就是把一個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題 的解的合併。這個技巧是很多高效算法的基礎,如排序算法(快速排序,歸併排序),傅立葉變換(快速傅立葉變 換)…… - 分治算法可以求解的一些經典問題
二分搜索
整數乘法
棋盤覆蓋
合併排序
快速排序
線性時間選擇
最接近點對問題
循環賽日程表
漢諾塔
基本步驟
分治法在每一層遞歸上都有三個步驟:
- 分解:將原問題分解爲若干個規模較小,相互獨立,與原問題形式相同的子問題
- 解決:若子問題規模較小而容易被解決則直接解,否則遞歸地解各個子問題
- 合併:將各個子問題的解合併爲原問題的解
算法設計模式
最佳實踐-漢諾塔
漢諾塔的傳說
漢諾塔:漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金
剛石柱子,在一根柱子上從下往上按照大小順序摞着 64
片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
假如每秒鐘一次,共需多長時間呢?移完這些金片需要 5845.54 億年以上,太陽系的預期壽命據說也就是數百 億年。真的過了 5845.54
億年,地球上的一切生命,連同梵塔、廟宇等,都早已經灰飛煙滅。
漢諾塔遊戲的演示和思路分析:
-
如果是有一個盤, A->C
如果我們有 n>=2 情況,我們總是可以看做是兩個盤 1.最下邊的盤 2. 上面的盤 -
先把 最上面的盤 A->B
-
把最下邊的盤 A->C
-
把 B 塔的所有盤 從 B->C
public class Hanoitower{
public static void main(String[] args){ hanoiTower(5,'A','B','C'); }
//漢諾塔的移動的方法 //使用分治算法
publicstaticvoidhanoiTower(intnum,chara,charb,charc){
//如果只有一個盤 if(num==1){
System.out.println("第 1 個盤從 "+a+"->"+c);
}else{ //如果我們有 n>=2 情況,我們總是可以看做是兩個盤 1.最下邊的一個盤 2. 上面的所有盤 //1. 先把 最上面的所有盤 A->B, 移動過程會使用到 c
hanoiTower(num-1,a,c,b);
//2. 把最下邊的盤 A->C
System.out.println("第"+num+"個盤從 "+a+"->"+c);
//3. 把 B 塔的所有盤 從 B->C, 移動過程使用到 a 塔
hanoiTower(num-1,b,a,c);
}
}
}
OVER!!!