軟考 從分治法中看時間複雜度計算

2021-07-24 09:54:19 字數 2363 閱讀 1131

分治演算法是按照下列方案來工作的:

1、將問題的例項劃分為幾個較小的例項,最好具有相等的規模(事實上,一般來說就是這樣來分的,而且分為2個例項的居多,注意是遞迴的分!!!)

2、對這些較小的例項求解(一般使用遞迴的方法,但在問題規模足夠小的時候也可以採用採用另乙個演算法(停止遞迴))

3、如果有必要的話,合併這些較小問題的解,以得到原始問題的解(事實上,乙個分治演算法的精華就在於合併解的過程)

不要忽視這三句話!!!它是許多分治演算法經驗的總結,有助於在分析問題中考慮如何去使用分治演算法,提請注意括號裡我的注釋!!!

形象的表示一下,截張圖:

大多數都是規模為n的問題,被劃分為2個規模為n/2的問題,更一般的情況下,從理論上分析一下:

乙個規模為n的例項可以劃分為b個規模為n/b的例項,其中a個例項是需要求解的,為了簡化分析,我們假設n是b的冪(每次都可以整的劃分),對演算法的執行時間,下面的遞推關係式是顯然的:

其中,a,b的含義已經說過了,f(n)表示將求解得到的a個子問題的解合併起來所需要的時間複雜度。

如何根據a,b以及f的階來確定這個演算法的時間複雜度呢?有下列主定理:(證明參見演算法導論)

1、b,a,f(n)的含義,這個要弄清楚,要不然恐怕你是無法記住這個結論的。

2、這個式子是乙個通用的數學表示式,在計算機的常用演算法策略中,它太概括了,我們往往用到的只是它範圍很小的一部分。

分析1:a和b的關係,其實a絕大多數時候都是等於b的吧(因為規模n劃分為了b個子規模,需要處理的是a個,參見a,b的含義),a,b的含義告訴我們a <= b(當這是最基本要滿足的條件)。常常要麼是 a==b(分成的子規模都要處理,然後去合併),要麼是a==1(實際上這是減治的思想,分成了b個子規模,但最終卻可以排除其他的,只在其中乙個子規模中去處理)。一般來說就是這樣,所以a,b並不是隨意的。

分析2:其實b要麼為2(幾乎所有情況)要麼為3(極少數情況)吧,這個分治思想裡面就說啦,一般來說都是分為2個規模相等的子規模(當然誰都想分的越多越好,這樣演算法就更快,但是現實是問題往往沒有那麼高效的演算法,找到乙個3的分治就已經很不錯了)

分析3:由上面2條可知,a,b的值幾乎就那麼幾個(當然我說的是幾乎所有書上可以看到的常見演算法案例),所以不用那麼擔心。

分析4:f(n)是線性的的情況很多(即d=1的情況是最多的)。再來看看a和b^d比較大小的關係說明了什麼:f(n)代表的是合併的複雜度,1<=a <= b,定性的分析,可以知道:

第一種情況:a < b^d

因為1<=a <= b,所以只要d>1,不管a,b是什麼(不管怎麼劃分規模,也不關需要處理幾個規模),總是第一種情況,時間複雜度是n^d。如果d=1呢,只要a < b(處理的比劃分的少),那麼還是第一種情況,時間複雜度也是n^d = n

第二種情況:a =  b^d

因為1<=a <= b,所以如果a=b(劃分多少處理多少),那麼d只能為1才能是這種情況。-----常見的歸併排序都是這樣而如果a < b,那b就只能<1才能是這種情況,一般很少見。

第三種情況:a  >  b^d

非常少見,我還木有見過這樣的演算法,一開始我認為這種情況不可能,但在理論上它是存在的。因為1<=a <= b,所以要滿足這個式子d必須<1 。

從這也可以看出這三個引數之間的關係,事實上是劃分的複雜度和合併的複雜度在爭搶複雜度的控制權。

說了這麼多,感覺越分析越複雜了嗎,其實不是,把這些分析想清楚,對遞推式的理解就更進一步了,有了上述分析,其實下面幾個常見的遞推式就包含了大多數的演算法:

t(n)  =   a * t(n/b)  +  f(n)的常見式子:

1、t(n)  =  2 * t(n/2) + o(n)      時間複雜度n*log(n)

一般來說分治演算法就是這樣,分成2個子規模的問題,需要處理的也是2個,對這兩個子規模合併又是線性的

a = b = 2,    d = 1;        a == b^d 由主定理得n*log(n)

只要a=b,d=1,就都是這個複雜度

2、t(n)  =  t(n/2) + o(n)        時間複雜度為n,線性的

a = 1,b = 2,d=1(分為2個子規模,但只對乙個子規模處理,合併也是線性的)

a < b^d,      時間複雜度是n^d = n

其實質押a < b,d=1,都是這個。

感覺對乙個定理解讀了這麼多,確實讓它變得更加複雜了,但如果你做了上述思考,相信對這個式子認識也更加深刻了一點。

軟考 遞迴式時間複雜度計算詳解

遞迴演算法的時間複雜度分析 在演算法分析中,當乙個演算法中包含遞迴呼叫時,其時間複雜度的分析會轉化為乙個遞迴方程求解。實際上,這個問題是數學上求解漸近階的問題,而遞迴方程的形式多種多樣,其求解方法也是不一而足,比較常用的有以下四種方法 方法一 代換法 代換法主要需要以下兩個步驟 1 猜答案,不需要完...

軟考 遞迴式時間複雜度計算詳解

遞迴演算法的時間複雜度分析 在演算法分析中,當乙個演算法中包含遞迴呼叫時,其時間複雜度的分析會轉化為乙個遞迴方程求解。實際上,這個問題是數學上求解漸近階的問題,而遞迴方程的形式多種多樣,其求解方法也是不一而足,比較常用的有以下四種方法 代換法主要需要以下兩個步驟 1 猜答案,不需要完全猜出來,不需要...

關於分治法的時間複雜度

分治法類似於二叉樹法,將乙個大問題,分成兩個小問題解決。由於子問題與母問題有相同的屬性,也就是一類問題,分步解決問題。這裡用歸併排序舉例。如果不用分治法,a1與a2到an每個數比較,進行n 1次,a2進行n 2次,總次數為 n 1 1 n 1 n 2 n一般排序為o n 2 時間複雜度較高。採用分治...