遞迴程式的漸近分析(以分治為例)
分治演算法的一般形式:將規模為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))
相關文章
- 分治與遞迴-找k個臨近中位數的數遞迴
- 20200925—遞迴與分治遞迴
- 程式設計中的遞迴(C語言為例)程式設計遞迴C語言
- 遞迴中Return例項分析遞迴
- 遞迴與迭代的聯絡以及優缺點(以c++為例)遞迴C++
- 遞迴 & 分治演算法深度理解遞迴演算法
- 歸併排序(C++_分治遞迴)排序C++遞迴
- 遞迴、分治和動態規劃遞迴動態規劃
- 遞迴與分治之大整數乘法遞迴
- 使用遞迴遍歷並轉換樹形資料(以 TypeScript 為例)遞迴TypeScript
- 遞迴、迭代和動態規劃:以九宮格鍵盤為例遞迴動態規劃
- 遞迴與分治演算法練習遞迴演算法
- 遞迴——深度優先搜尋(DFS)——以滑雪問題為例(自頂而下)遞迴
- 計算機演算法設計與分析筆記(二)——遞迴與分治計算機演算法筆記遞迴
- 循序漸進掌握遞迴正規表示式遞迴
- 遞迴函式例項大全遞迴函式
- Js來分析遞迴JS遞迴
- for迴圈的例項分析
- 順序表應用7:最大子段和之分治遞迴法遞迴
- 為了效能,慎用遞迴遞迴
- 三、遞迴樹分析法遞迴
- 以Lgwr Worker為例,基於Strace 分析 Oracle 資料庫行為的方法Oracle資料庫
- RabbitMQ的使用--以topic路由為例MQ路由
- 遍歷二叉樹的遞迴與非遞迴程式碼實現二叉樹遞迴
- 對遞迴和迭代的效率的思考和分析遞迴
- 遞迴和尾遞迴遞迴
- 演算法分析__遞迴跟蹤演算法遞迴
- 遞迴求填空結果的python程式遞迴Python
- 什麼是遞迴?遞迴和迴圈的異同遞迴
- 網球迴圈賽思路 - 分治法求解(無程式碼)
- 遞迴示例-指定數字以內的所有排列組合(Reduce)遞迴
- 快速排序【遞迴】【非遞迴】排序遞迴
- ML-梯度下降程式碼-線性迴歸為例梯度
- MYSQL: 表表示式(CTE)實現遞迴例項MySql遞迴
- Linux下的使用(以ubuntu16.04為例)LinuxUbuntu
- python so.environ的使用(以pysolc為例)Python
- 以opencv為例說明cmake中的findpackage()OpenCVPackage
- 遞迴:698、劃分為k個相等的子集遞迴
- c語言程式的執行過程(以輸出hello,world為例)C語言