遞迴程式的漸近分析(以分治為例)
分治演算法的一般形式:將規模為n的問題按照每次分為k個規模為(n / m)的子問題求解,合併成本為f(n):
約定:
- log(a, b)表示以a為底求b的對數
- 以下分析沒有嚴格區分是否是否算上最後一行
一般地,有:
T(n) = O(1) n = 1
T(n) = k * T(n / m) + f(n) n > 1
部分1:只看k * T(n / m)
- 可以發現會巢狀log(m, n)次
- 即有計算次數:t = k ^ log(m, n)
- 因為對於一個演算法,k一般為常數,我們希望這個公式更明顯地表徵n
- 於是有:t = n ^ log(m, k)
- 從中可以看出部分1主要取決於分割的效率
即m(n / m表示子問題規模)與k(子問題的數量)的關係
- m < k,表示劃分子問題時有冗餘
- m = k,可以表示分割處理可以剛好對問題無重無漏的劃分
- m > k,即問題被分成了m份,我們只去處理其中的k份
部分2:對於f(n),從一個直觀角度考慮:
- 想象問題的處理過程為一顆樹
- 設最初的問題為樹根(第0層)
- 對其分治後有k個子問題,即有k棵子樹(每棵子樹的規模為n / m)
- 遞迴定義子樹
- 現在我們有一棵樹,它代表了整個處理過程(在漸近意義下,不使一般性,設其為一棵滿k叉樹)
- 我們一層一層看
- 對於第i層,共有k ^ i個節點,單個節點的規模為n / m ^ i
- 於是,每一層的計算成本是k ^ i * f(n / m ^ i)
- 按行加和可得整體成本
彙總:
- 部分1就是整個遞迴完全展開中與f(n)無關的部分,是按分治樹中每個節點計算成本為常數來計算,可以理解為樹的大小
- 部分2就是整個遞迴完全展開中與f(n)有關的部分,分治樹中只在每一層節點有相同的權值
- 可以看出來,f(n)很重要,只有當它與規模無關(O(1))時才能不增加演算法的複雜性
例子:
二分查詢:
- 因為二分查詢總是將解均分為兩半並丟棄一半,即其分治樹退化為線性表
- 有m = 2, k = 1
- 而且沒有合併需求,視f(n)為O(1)
- 於是有:
- 二分查詢的複雜度為:O(log n)
- 注意:當k = 1時,分析1所示的部分已經失效了,需要規定f(n)至少為O(1)(即f(n)總是存在)來至少表示樹的大小
並歸排序
- m = k = 2
- f(n) 為O(n)
- 考察任一層i的成本
- 單個節點的成本為f(n / m ^ i) = O(n / m ^ i)
- 共有k ^ i個節點
- 每一層的總合併成本總是O(n / 2 ^ i) * O(2 ^ i) = O(n)
- 共有log(2, n) - 1層需要合併
- 漸進地有O(n * log(n))
相關文章
- 程式設計中的遞迴(C語言為例)程式設計遞迴C語言
- 遞迴與迭代的聯絡以及優缺點(以c++為例)遞迴C++
- 歸併排序(C++_分治遞迴)排序C++遞迴
- 遞迴 & 分治演算法深度理解遞迴演算法
- 遞迴與分治演算法練習遞迴演算法
- 使用遞迴遍歷並轉換樹形資料(以 TypeScript 為例)遞迴TypeScript
- 遞迴、迭代和動態規劃:以九宮格鍵盤為例遞迴動態規劃
- 計算機演算法設計與分析——遞迴與分治策略(一)計算機演算法遞迴
- javascript遞迴例項程式碼演示JavaScript遞迴
- css3迴圈漸隱漸現效果程式碼例項CSSS3
- 計算機演算法設計與分析筆記(二)——遞迴與分治計算機演算法筆記遞迴
- Js來分析遞迴JS遞迴
- Java中的遞迴原理分析Java遞迴
- 遞迴函式例項大全遞迴函式
- 順序表應用7:最大子段和之分治遞迴法遞迴
- jquery漸隱漸現程式碼例項jQuery
- 遞迴演算法轉換為非遞迴演算法的技巧遞迴演算法
- arguments.callee實現遞迴簡單程式碼例項遞迴
- 網球迴圈賽思路 - 分治法求解(無程式碼)
- 三、遞迴樹分析法遞迴
- 遞迴和尾遞迴遞迴
- 以Lgwr Worker為例,基於Strace 分析 Oracle 資料庫行為的方法Oracle資料庫
- 遍歷二叉樹的遞迴與非遞迴程式碼實現二叉樹遞迴
- 1223 遞迴下降語法分析程式設計遞迴語法分析程式設計
- 把ChatGPT調教成機器學習專家,以邏輯迴歸模型的學習為例ChatGPT機器學習邏輯迴歸模型
- 演算法分析__遞迴跟蹤演算法遞迴
- 對遞迴和迭代的效率的思考和分析遞迴
- 快速排序【遞迴】【非遞迴】排序遞迴
- 【演算法】2 由股票收益問題再看分治演算法和遞迴式演算法遞迴
- 遞迴程式中的靜態變數遞迴變數
- 點選實現元素的漸隱或者漸現程式碼例項
- 編寫程式碼的若干個基本規則(以Java為例)Java
- 建立索引的原則-以innodb為例索引
- 遞迴遞迴
- Java 執行緒內 遞迴 Bug 一例Java執行緒遞迴
- MYSQL: 表表示式(CTE)實現遞迴例項MySql遞迴
- ML-梯度下降程式碼-線性迴歸為例梯度
- ACM(遞迴遞推—A)ACM遞迴