日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法分析之-主方法分析递归式

發布時間:2025/6/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法分析之-主方法分析递归式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

主方法

在算法分析中,我們主要使用代入法,遞歸樹法,和主方法來分析遞歸式
而主方法為如下形式的遞歸式提供了一套“菜譜”式解法:

T(n)=aT(nb)+f(n)T(n)=aT(\frac nb)+f(n)T(n)=aT(bn?)+f(n)


幾個主要形式:

1.

若對某個常數 ε>0\varepsilon \gt 0ε>0

f(n)=ο(nlog?ba?ε)f(n) = \omicron (n^{\log_b{a-\varepsilon} })f(n)=ο(nlogb?a?ε)

那么
T(n)=θ(nlogba)T(n) = \theta (n^{log_ba})T(n)=θ(nlogb?a)


2.


f(n)=θ(nlogba)f(n)=\theta(n^{log_ba})f(n)=θ(nlogb?a)

T(n)=θ(nlogbalg?n)T(n)=\theta(n^{log_ba}\lg n)T(n)=θ(nlogb?algn)


3.

若對某個常數 ε>0\varepsilon>0ε>0
f(n)=Ω(nlog?ba+ε)f(n) = \Omega(n^{\log_b{a+\varepsilon} })f(n)=Ω(nlogb?a+ε)

且對于某個常數c<1和所有足夠大的n有
af(nb)≤cf(n)af(\frac nb)\le cf(n)af(bn?)cf(n)


T(n)=θ(f(n))T(n) = \theta(f(n))T(n)=θ(f(n))


將函數f(n)f(n)f(n)與函數nlogban^{log_b{a}}nlogb?a進行比較。直覺上,兩個函數較大者決定了遞歸式的解。

證明:

這個要死記硬背那可太難了,還是證明一下怎么來的比較好

T(N)=aT(Nb)+θ(Nk)T(N)=aT(\frac Nb) + \theta (N^k)T(N)=aT(bN?)+θ(Nk)

a表示一個問題分解成子問題的數目,N/b表示每個子問題的規模a表示一個問題分解成子問題的數目,N/b表示每個子問題的規模aN/b

不妨設N=bm,即大問題是子問題規模的m次冪,且T(1)=1不妨設N=b^m,即大問題是子問題規模的m次冪,且T(1)=1N=bmmT(1)=1

于是原式有:T(bm)=aT(bm?1)+(bk)m于是原式有:T(b^m)=aT(b^{m-1})+(b^k)^mT(bm)=aT(bm?1)+(bk)m

左右同除am:T(bm)am=T(bm?1)am?1+(bka)m左右同除a^m:\frac {T(b^m)}{a^m}=\frac {T(b^{m-1})}{a^{m-1}}+(\frac {b^k}a)^mamamT(bm)?=am?1T(bm?1)?+(abk?)m

于是我們的到了一個等差數列,初項設m=0,T(1)/1=1于是我們的到了一個等差數列,初項設m=0,T(1)/1=1m=0T(1)/1=1

求和之后得到:T(bm)am=∑i=0m(bka)i求和之后得到:\frac {T(b^m)}{a^m}=\displaystyle\sum_{i=0}^m(\frac {b^k}a)^iamT(bm)?=i=0m?(abk?)i
即為:T(N)=am∑i=0m(bka)i即為:T(N)=a^m\displaystyle\sum_{i=0}^m(\frac {b^k}a)^iT(N)=ami=0m?(abk?)i

1.當a>bk即k=logba?ε即f(n)=θ(Nk)=ο(nlog?ba?ε)1.當a>b^k \hspace3ex即k=log_ba- \varepsilon \hspace3ex即f(n) = \theta(N^k)=\omicron (n^{\log_b{a-\varepsilon} })1.a>bkk=logb?a?εf(n)=θ(Nk)=ο(nlogb?a?ε)
此時級數的和為一個小于無窮大的常數,于是T(N)=O(am)=O(alogbN)=O(Nlogba)此時級數的和為一個小于無窮大的常數,于是T(N)=\Omicron(a^m)=\Omicron(a^{log_bN})=\Omicron(N^{log_ba})T(N)=O(am)=O(alogb?N)=O(Nlogb?a)

2.當a=bk即k=logba即f(n)=θ(Nk)=θ(Nlog?ba)2.當a=b^k \hspace3ex即k=log_ba \hspace3ex即f(n)=\theta(N^k)=\theta(N^{\log_ba })2.a=bkk=logb?af(n)=θ(Nk)=θ(Nlogb?a)
此時級數的和為m,于是T(N)=(m+1)am=O(Nlog?balogbN)此時級數的和為m,于是T(N)=(m+1)a^m=\Omicron(N^{\log_ba }log_bN)mT(N)=(m+1)am=O(Nlogb?alogb?N)

3.當a<bk即k=logba+ε即f(n)=θ(Nk)=Ω(nlog?ba?ε)3.當a<b^k \hspace3ex即k=log_ba+\varepsilon\hspace3ex即f(n)=\theta(N^k)=\Omega(n^{\log_b{a-\varepsilon} })3.a<bkk=logb?a+εf(n)=θ(Nk)=Ω(nlogb?a?ε)
此時級數的和為(bk/a)m?1bk/a?1,于是T(N)=am(bk/a)m?1bk/a?1=O(Nk)此時級數的和為\frac{(b^k/a)^m-1}{b^k/a-1},于是T(N)=a^m{\frac{(b^k/a)^m-1}{b^k/a-1}}=\Omicron(N^k)bk/a?1(bk/a)m?1?T(N)=ambk/a?1(bk/a)m?1?=O(Nk)

例如:矩陣相乘的Strassen算法:
T(N)=7T(N/2)+O(N2)T(N)=7T(N/2)+O(N^2)T(N)=7T(N/2)+O(N2)
有T(N)=O(Nlog27)=O(N2.81)有T(N)=O(N^{log_27})=O(N^{2.81})T(N)=O(Nlog2?7)=O(N2.81)
很方便很炫酷有沒有!!!

總結

以上是生活随笔為你收集整理的算法分析之-主方法分析递归式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。