常用十大演算法 分治演算法

2021-10-08 11:13:39 字數 1742 閱讀 2596

將複雜問題拆分成許多個具有規律的重複性操作的子問題,通過求解子問題再合併,使之成為複雜問題的結果。

分治演算法可以求解的一些經典問題:

二分搜尋,大整數乘法,棋盤覆蓋,合併排序,快速排序

線性時間選擇,最接近點對問題,迴圈賽日程表,漢諾塔

下面以漢諾塔求解為例,了解分治演算法:

漢諾塔(又稱河內塔)問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片**圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。

以3盤為例,漢諾塔傳統解法流程

3盤還好,6步完成,但4盤,要15步,5盤,要31步...所以我們可以將 n>=2 的漢諾塔問題,進行拆分。

n==1時:直接將盤從起始位置(a)移動到目標位置(c)

n>=2時:

1,最底層上面所有盤為乙個整體,從起始位置(當前為a)移動到暫留位置(當前為b)

2,最底層盤,從起始位置(當前為a)移動到目標位置(當前為c)

3,將上面所有盤的整體,由暫留位置(當前為b)移動到目標位置(當前為c)

執行完上述操作後,遞迴再次執行上述操作,不過此時的最底層盤變為剛開始的次底層盤,以此類推,直到 n==1 時,結束遞迴。

**實現:

package cn.datastructureandalgorithm.demo.tenalgorithm.divideandconquer;

public class 分治演算法_dac_漢諾塔

/*** 分治演算法解決漢諾塔問題

* @param num 漢諾塔盤數

* @param a 每次遞迴的起始位置

* @param b 每次遞迴的暫留位置

* @param c 每次遞迴的目標位置

*/public static void hanoitower(int num,char a,char b,char c)else }}

第1個盤從 a移動到b

第2個盤從 a移動到c

第1個盤從 b移動到c

第3個盤從 a移動到c

第1個盤從 c移動到a

第2個盤從 c移動到c

第1個盤從 a移動到b

第4個盤從 a移動到c

第1個盤從 b移動到c

第2個盤從 b移動到c

第1個盤從 c移動到a

第3個盤從 b移動到c

第1個盤從 a移動到b

第2個盤從 a移動到c

第1個盤從 b移動到c

其他常用演算法,見下各鏈結

【常用十大演算法_二分查詢演算法】

【常用十大演算法_貪心演算法】

【常用十大演算法_動態規劃演算法(dp)】

【常用十大演算法_kmp演算法】

【常用十大演算法_普里姆(prim)演算法,克魯斯卡爾(kruskal)演算法】

【常用十大演算法_迪傑斯特拉(dijkstra)演算法,弗洛伊德(floyd)演算法】

【常用十大演算法_回溯演算法】

數學建模十大常用演算法

1 蒙特卡羅 又稱隨機性模擬演算法,是通過計算機 來解決問題的演算法,同時可以通過模擬來檢驗模型的正確性 2 資料擬合 引數估計 插值等資料處理 比賽中通常會遇到大量的資料處理問題,而處理資料的關鍵在於這些演算法,通常使用matlab作為工具 3 線性規劃 整數規劃 多元規劃 二次規劃類問題 建模中...

機器學習十大常用演算法

根據一些 feature 進行分類,每個節點提乙個問題,通過判斷,將資料分為兩類,再繼續提問。這些問題是根據已有資料學習出來的,再投入新資料的時候,就可以根據這棵樹上的問題,將資料劃分到合適的葉子上。在源資料中隨機選取資料,組成幾個子集源資料,這幾個子集得到幾個決策樹,將新資料投入到這 m 個樹中,...

十大演算法解析

一 什麼是演算法?演算法就是任何明確定義的計算過程,它接收一些值或集合作為輸入,並產生一些值或集合作為輸出。這樣,演算法就是將輸入轉換為輸出的一系列計算過程。thomas h.cormen,chales e.leiserson 2009 演算法導論第三版 二 有效的演算法應該含有三個重要特性 1.演...