分治算法
一:分治算法介紹
1):分治算法是一種很重的算法,在字面上解釋就是“分而治之”,就是將一個複雜的問題先分成兩個或者更多的相同或者是相似的子問題,再把子問題分成更小的子問題。。。。直到最後的子問題可以簡單直接求解,原問題的解即子問題的解的合併。這個技巧 是很多高效算法的基礎,如排序算法(快速排序,歸併排序等)。傅里葉變換等
2):分治算法可以求解一些經典問題:
- 二分搜索
- 大整數乘法
- 棋盤覆蓋
- 合併排序
- 快速排序
- 線性時間選擇
- 最接近點對問題
- 循環賽日程
- 漢諾塔
二:分治算法的步驟
分治算法在每一層的遞歸上都有三個步驟
1):分解:將原問題分解成若干個規模較小,相互獨立,與原問題形式相同的子問題
2):解決:若子問題的規模較小而且容易被解決則直接解決,否則遞歸地解決各個子問題
3):合併:將各個子問題的解合併位原問題的解
三:分治算法的實踐——漢諾塔
漢諾塔介紹:
漢諾塔問題是源於印度古老傳說的一個益智遊戲。大梵天創造世界的時候創造了三根金剛石柱,在一根柱子上從下向上按照大小順序摞着64片黃金圓盤,大梵天命令婆羅門把圓盤從下面按照大小順序重新擺放在另一根柱子上,並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
漢諾塔思路分析:
我們假設這三根金剛石柱爲A,B,C
1):當只有一個盤:從A->C
當我們有n>=2個盤的時候,我們總是可以看作兩個盤,最底下的是一個盤,其餘的爲另一個盤。
1):我們先將上面的盤移動到B:A->B
2):把下面的盤移動到C:A->C
3):在把B塔上的盤移動到C:B->C
四:代碼實現
package 分治算法;
/*
分治算法經典例題:漢諾塔
*/
public class HannuoTower {
public static void main(String[] args) {
hannuoTower(5,'A','B','C');
}
/**
*
* @param num 表示有多少的盤子
* @param a 表示第A根柱子
* @param b 表示第B根柱子
* @param c 表示第C根柱子
*/
public static void hannuoTower(int num,char a,char b,char c){
if (num == 1){
//表示只有一個盤子,那麼就是直接從A柱到C柱
System.out.println("第1個盤子從"+a+"->"+c);
}else { //表示num>1
//第一步將最底下盤子以上的盤子從A移動到B柱,過程中會使用到C柱
hannuoTower(num-1,a,c,b);
//第2步將最底下的盤子移動到C柱
System.out.println("第"+(num)+"個盤子從"+a+"->"+c);
//第三步將B柱的盤子移動到C柱,過程中會用到A柱
hannuoTower(num-1,b,a,c);
}
}
}