從零學習經典演算法系列 分治與遞迴2 主方法

2021-06-22 17:25:01 字數 1804 閱讀 1183

這一篇我就主方法(master method)給出介紹和證明,相信之前不了解該方法的同學通過本篇部落格的介紹之後,能有一種醍醐灌頂的感覺,能對遞迴表示式的求解方法有乙個形象的認識和理解。

1、主定理

主方法給出求解形如t(n) = at(n/b) + f(n)的遞迴表示式的定理性方法,這裡常數a>=1,b>1,f(n)是乙個漸進趨正的函式(存在n0,當n>n0,有f(n)>0)。

遞迴式t(n) = at(n/b) + f(n)描述了將規模為n的問題劃分為a個子問題的演算法的執行時間,每個子問題規模為n/b,a和b是正整數。a個子問題被分別遞迴地求解,時間各為t(n/b)。劃分原問題和合併答案的代價由函式f(n)描述。

*主定理:設a>=1,b>1為常數,f(n)是乙個函式,t(n)由遞迴式t(n) = at(n/b) + f(n)對非負整數定義。那麼t(n)可能有如下的漸進界,

2、主定理的形象解釋

首先我們將抽象的遞迴式進行展開,看看效果如何。

然後給出遞迴式t(n) = at(n/b) + f(n)的遞迴樹圖形:

圖1 主定理的思想

case 1情況下,遞迴樹的每層成本從根向下呈幾何級數增長,成本在葉節點一層達到最高,即最後一次遞迴是整個過程中成本最高的一次,故其佔主導地位。所以遞迴分治的總成本在漸進趨勢上和葉子層的成本一樣。

case 2情況下,遞迴樹每層的成本在漸進趨勢上一樣,即每層都是n^logb(a)。由於有logb(n)層,因此總成本為每層的成本乘以logb(n)。

case 3情況下,遞迴樹每層成本呈幾何級數遞減,樹根一層的成本佔主導地位。因此,總成本就是樹根層的成本。

3、主定理的證明

case 1由所有葉結點的代價決定

case 2 樹的代價均勻地分布在各層上

case 3 由根結點的代價決定

特別說明:f代表的是分治策略中的分解(成子問題)和合併(子問題)的成本。由於f(n)的漸進增長趨勢》θ(n^logb(a)),所以該分治策略的分解和合併成本高於子問題的解決成本。而如果在這種情況要獲得解,分解和合併的成本應該逐級下降;否則,分解和合併成本隨著分解的推進將呈現發散趨勢,這樣總成本有可能不會收斂。那麼這種分治策略就顯得沒有意義了。

而如果分解與合併成本逐級下降,則意味著函式f滿足af(n/b)<=cf(n),其中c<1。因此,解為t(n)=θ(f(n))。

小結:

以上我們介紹的主方法只考慮n被b^i整除的情況,至於不能整除的情況需要應用數學技巧來解決下取整函式和上取整函式的處理問題。

下一小節,我將就分治策略的應用舉幾個典型的例項,進一步理解分治思想。

經典演算法系列之 遞迴

1 前言 演算法,在計算機中的地位,就相當於人類大腦的決策中樞系統,哪怕最簡單的演算法,其精妙的思維方式,都可以讓人開啟一扇新的視窗。演算法,它不僅僅只是狹義的用來解決電腦科學領域的問題,更是一種 思維方式 演算法思維,是一種深度思考和創造的過程。演算法,只有真正理解了,而不只是所謂的知道,並將應用...

經典機器學習演算法系列 svm

支援向量機是比較好的分類器。對iris資料集分類可以得到100 的準確率 資料python 如下 import numpy as np from sklearn import svm from sklearn.metrics import accuracy score a np.loadtxt ir...

第六講 經典演算法之遞迴與分治

遞迴與分治,顧名思義,就是既有遞迴又有分治。遞迴指函式呼叫自身,分治是指乙個大的問題被分成了幾個小問題,分而治之。總得來說,按我的理解,就是將乙個具體的問題抽象成一類問題,在解決該具體問題時,將原問題逐個的分解成更小的問題,然後分別遞迴呼叫同乙個函式來解決。回顧一下我們熟悉的斐波那契數列的計算 f ...