
- 資料結構與演算法
- DSA - 首頁
- DSA - 概覽
- DSA - 環境設定
- DSA - 演算法基礎
- DSA - 漸進分析
- 資料結構
- DSA - 資料結構基礎
- DSA - 資料結構和型別
- DSA - 陣列資料結構
- 連結串列
- DSA - 連結串列資料結構
- DSA - 雙向連結串列資料結構
- DSA - 迴圈連結串列資料結構
- 棧與佇列
- DSA - 棧資料結構
- DSA - 表示式解析
- DSA - 佇列資料結構
- 搜尋演算法
- DSA - 搜尋演算法
- DSA - 線性搜尋演算法
- DSA - 二分搜尋演算法
- DSA - 插值搜尋
- DSA - 跳躍搜尋演算法
- DSA - 指數搜尋
- DSA - 斐波那契搜尋
- DSA - 子列表搜尋
- DSA - 雜湊表
- 排序演算法
- DSA - 排序演算法
- DSA - 氣泡排序演算法
- DSA - 插入排序演算法
- DSA - 選擇排序演算法
- DSA - 歸併排序演算法
- DSA - 希爾排序演算法
- DSA - 堆排序
- DSA - 桶排序演算法
- DSA - 計數排序演算法
- DSA - 基數排序演算法
- DSA - 快速排序演算法
- 圖資料結構
- DSA - 圖資料結構
- DSA - 深度優先遍歷
- DSA - 廣度優先遍歷
- DSA - 生成樹
- 樹資料結構
- DSA - 樹資料結構
- DSA - 樹的遍歷
- DSA - 二叉搜尋樹
- DSA - AVL樹
- DSA - 紅黑樹
- DSA - B樹
- DSA - B+樹
- DSA - 伸展樹
- DSA - 字典樹
- DSA - 堆資料結構
- 遞迴
- DSA - 遞迴演算法
- DSA - 使用遞迴實現漢諾塔
- DSA - 使用遞迴實現斐波那契數列
- 分治法
- DSA - 分治法
- DSA - 最大最小問題
- DSA - Strassen矩陣乘法
- DSA - Karatsuba演算法
- 貪心演算法
- DSA - 貪心演算法
- DSA - 旅行商問題(貪心演算法)
- DSA - Prim最小生成樹
- DSA - Kruskal最小生成樹
- DSA - Dijkstra最短路徑演算法
- DSA - 地圖著色演算法
- DSA - 分數揹包問題
- DSA - 帶截止日期的作業排序
- DSA - 最佳合併模式演算法
- 動態規劃
- DSA - 動態規劃
- DSA - 矩陣鏈乘法
- DSA - Floyd-Warshall演算法
- DSA - 0-1揹包問題
- DSA - 最長公共子序列演算法
- DSA - 旅行商問題(動態規劃)
- 近似演算法
- DSA - 近似演算法
- DSA - 頂點覆蓋演算法
- DSA - 集合覆蓋問題
- DSA - 旅行商問題(近似演算法)
- 隨機化演算法
- DSA - 隨機化演算法
- DSA - 隨機化快速排序演算法
- DSA - Karger最小割演算法
- DSA - Fisher-Yates洗牌演算法
- DSA有用資源
- DSA - 問答
- DSA - 快速指南
- DSA - 有用資源
- DSA - 討論
分治演算法
使用分治法,手頭的問題被分解成更小的子問題,然後每個子問題獨立解決。當我們繼續將子問題分解成更小的子問題時,我們最終可能會到達一個無法再進行分解的階段。這些最小的子問題使用原始解法進行解決,因為計算它們需要較少的時間。最後,將所有子問題的解合併起來,以獲得原始問題的解。

從廣義上講,我們可以將分治方法理解為一個三步過程。
分解/拆分
此步驟涉及將問題分解成更小的子問題。子問題應代表原始問題的一部分。此步驟通常採用遞迴方法來劃分問題,直到沒有子問題可以進一步劃分。在此階段,子問題的大小變為原子級別,但仍然代表實際問題的一部分。
解決/征服
此步驟接收許多需要解決的較小子問題。通常,在此級別,問題被認為是“自行解決”的。
合併/組合
當較小的子問題得到解決時,此階段遞迴地將它們組合起來,直到它們形成原始問題的解決方案。這種演算法方法以遞迴方式工作,並且解決和合並步驟非常接近,以至於它們看起來像一個步驟。
陣列作為輸入
各種演算法可以以各種方式接收輸入,以便可以使用分治技術解決它們。陣列就是其中之一。在需要列表形式輸入的演算法中,例如各種排序演算法,陣列資料結構最常使用。
在下面的排序演算法的輸入中,陣列輸入被分解成子問題,直到它們無法進一步分解。

然後,子問題被排序(解決步驟)併合並以形成原始陣列的解決方案(合併步驟)。

由於陣列是索引的線性資料結構,因此排序演算法最常使用陣列資料結構來接收輸入。
連結串列作為輸入
另一種可用於接收分治演算法輸入的資料結構是連結串列(例如,使用連結串列進行歸併排序)。與陣列類似,連結串列也是線性資料結構,按順序儲存資料。
考慮連結串列上的歸併排序演算法;遵循非常流行的龜兔演算法,列表被分割,直到它無法進一步分割。

然後,對列表中的節點進行排序(解決)。然後遞迴地組合(或合併)這些節點,直到達到最終解決方案。

各種搜尋演算法也可以在連結串列資料結構上執行,但使用略有不同的技術,因為連結串列不是索引的線性資料結構。必須使用列表節點中可用的指標來處理它們。
分治法的優缺點
分治法支援並行性,因為子問題是獨立的。因此,使用此技術設計的演算法可以在多處理器系統或不同的機器上同時執行。
在這種方法中,大多數演算法都是使用遞迴設計的,因此記憶體管理非常高。對於遞迴函式,使用堆疊,其中需要儲存函式狀態。
分治法的示例
以下計算機演算法基於分治程式設計方法 -
最近點對(點)
有各種方法可以解決任何計算機問題,但上面提到的方法是分治法的很好的例子。