目錄
1. 分治算法簡單介紹
1.1介紹
分治法是一種很重要的算法。字面上的解釋是“分而治之”,就是把一個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的問題......知道最後的子問題可以簡單的直接求解,原問題的解即子問題的解的合併。這個技巧是很多高效算法的基礎,如排序算法(快速排序、歸併排序)等等。
1.2 分治算法可以求解的一些經典問題:
- 二分搜索
- 大整數乘法
- 棋盤覆蓋
- 歸併排序
- 快速排序
- 線性時間選擇
- 最接近點對問題
- 循環賽日程表
- 漢諾塔
2. 分治算法的基本步驟
- 分解:將原問題分解爲若干個規模較小,相互獨立,與原問題形式相同的子問題
- 解決:若子問題規模較小而容易被解決則直接解,否則遞歸的解各個子問題
- 合併:將各個子問題的解合併爲原問題的解
3. 分治算法最佳實踐—漢諾塔
漢諾塔的傳說
漢諾塔:漢諾塔(又稱河內塔)問題是源於印度-一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在-根柱子上從下往上按照大小順序摞着64片黃金圓盤。大梵天命令婆羅門把圓盤從下面漢諾塔:漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在-根柱子上從下往上按照大小順序摞着64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
假如每秒鐘一次,共需多長時間呢?移完這些金片需要5845.54億年以上,太陽系的預期壽命據說也就是數百億年。真的過了5845.54億年,地球上的一切生命,連同梵塔、廟宇等,都早已經灰飛煙滅。
思路分析
- 如果有一個盤,A->C
- 如果盤>=2,我們可利用分治思維,看作兩個盤,最下邊的一個盤和上邊所有的盤
- 當有兩個盤時,我們的移動爲:
先把最上邊的盤,A->B;
把最下邊的盤,A->C;
將B所有的盤,B->C
4. 代碼演示
代碼其實很簡單,主要是理解分而治之的思維
http://www.hannuota.cn/,去吧皮卡丘,玩一玩就懂了~~
/**
* @author 浪子傑
* @version 1.0
* @date 2020/6/5
*/
public class HanotaDemo {
public static void main(String[] args) {
hanota(3, 'A', 'B', 'C');
}
/**
* 漢諾塔移動,分治算法
*
* @param num 盤子的數量
* @param a A柱
* @param b B柱
* @param c C柱
*/
public static void hanota(int num, char a, char b, char c) {
// 如果只有一個盤子,直接從a移動到c
if (num == 1) {
System.out.println("第1個盤從 " + a + "->" + c);
} else {
// 如果盤子梳理大於1,則先把盤子從a移動到b
hanota(num - 1, a, c, b);
// 然後將盤子從a移動到c
System.out.println("第" + num + "個盤從 " + a + "->" + c);
// 最後將盤子從b移動到c
hanota(num - 1, b, a, c);
}
}
}