演算法第二篇之分治
演算法基本思想:大致可分為如下幾類:分治演算法、貪心演算法、動態規劃、回溯法、分支限界、概率演算法和隨機演算法等等
分治演算法
分治即分而治之。一個問題規模過大不容易直接解決,就可以劃分成許多小問題,如果小問題不容易求解,那麼可以再劃分成規模更小的問題,直到規模小到很容易解決為止,解決這些小問題,再將小問題的解合併成大問題的解。
分治演算法常用的實現方法是遞迴
遞迴
遞迴,就是在函式內部呼叫本函式自身。形式如下
void foo()
{ //…
foo(); //遞迴
//…
}
例子:
階乘
Fibonacci數列
漢諾塔問題
全排列問題
經典問題
(1)二分搜尋
(2)大整數乘法
(3)Strassen矩陣乘法
(4)棋盤覆蓋
(5)合併排序
(6)快速排序
(7)線性時間選擇
(8)最接近點對問題
(9)迴圈賽日程表
二分搜尋
問題:從一個已經排好序的序列中,查詢某一個元素。
1. 將陣列從中間分成上下兩半,如果中間的值剛好是要查詢的元素,直接輸出結果。
2. 如果中間的值比要查詢的大,那麼說明要查詢的元素只可能出現在上半段,再對上半段進行二分搜尋。
3. 如果中間的值比要查詢的小,那麼說明要查詢的元素只可能出現在下半段,再對下半段進行二分搜尋。
棋盤覆蓋
問題: 在一個2k×2k 個方格組成的棋盤中,恰有一個方格與其它方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。在棋盤覆蓋問題中,要用圖示的4種不同形態的L型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個L型骨牌不得重疊覆蓋。
分析: 當k>0時,將2k×2k棋盤分割為4個2k-1×2k-1子棋盤(a)所示。
特殊方格必位於4個較小子棋盤之一中,其餘3個子棋盤中無特殊方格。為了將這3個無特殊方格的子棋盤轉化為特殊棋盤,可以用一個L型骨牌覆蓋這3個較小棋盤的會合處,如 (b)所示,可以把黃色的方格看做是較小棋盤的特殊方格,從而將原問題轉化為4個較小規模的棋盤覆蓋問題。
遞迴地使用這種分割,直至棋盤簡化為棋盤1×1。
相關文章
- 分治演算法演算法
- 分治演算法-骨牌鋪方格演算法
- Python演算法:分治法Python演算法
- [演算法] 一些分治演算法
- 演算法學習-CDQ分治演算法
- 分治演算法-眾數問題演算法
- 【演算法】分治四步走演算法
- 遞迴 & 分治演算法深度理解遞迴演算法
- 演算法筆記04--分治法之尋找最大最小元素演算法筆記
- 遞迴與分治演算法練習遞迴演算法
- 從分治演算法到 Hadoop MapReduce演算法Hadoop
- 樹分治 - 點分治
- 五大常用演算法之一:分治演算法演算法
- Python 一網打盡<排序演算法>之從希爾排序演算法的分治哲學開始Python排序演算法
- 搞定面試演算法系列 —— 分治演算法三步走面試演算法
- 【五大常用演算法】一文搞懂分治演算法演算法
- 五大常用演算法:一文搞懂分治演算法演算法
- 分治演算法基本原理和實踐演算法
- 分治演算法-求解棋盤覆蓋問題演算法
- 分治
- 【分治演算法】歸併排序,快速排序和漢諾塔演算法排序
- 演算法導論_第四章_分治策略演算法
- Note - 樹分治(點分治、點分樹)
- 點分治
- CDQ分治
- 分治法
- 分治合集
- 《演算法》系列—大白話聊分治、回溯,手撕八皇后演算法
- 演算法學習筆記-暴力搜尋和分治法演算法筆記
- 演算法:利用分治演算法求解N個元素中的第M大元素演算法
- 【演算法】2 由股票收益問題再看分治演算法和遞迴式演算法遞迴
- 演算法設計--眾數和重數問題(分治法)演算法
- spring原始碼之refresh第二篇Spring原始碼
- 分治—快速排序排序
- 根號分治
- 以猜數字遊戲引出的分治演算法的理解與思考遊戲演算法
- 「演算法思想」分治、動態規劃、回溯、貪心一鍋燉演算法動態規劃
- SQL*Plus菜鳥筆記之第二篇SQL筆記