2 演算法分析基礎 時間複雜度判定等 含習題

2021-10-24 03:24:45 字數 1803 閱讀 1759

之所以對效率給出這樣詳細的定義,是為了表達:對於某些問題不存在有效的演算法

上界:如果對於函式t(n),有充分大的n,函式t(n)小於f(n)的某個常數倍,則t(n)=o(f(n)),此時我們說f是t的漸進上界

下界:如果對於函式t(n),有充分大的n,函式t(n)大於f(n)的某個常數倍,則t(n)=ω

\omega

ω(f(n)),此時我們說f是t的漸進下界

漸進的緊的界:如果lim f(n)/g(n)=c>0 那麼f(n)=θ

\theta

θ(g(n)),此時也可以說g(n)即是f(n)的上界,也是其下界

傳遞性:這三個符號都具有傳遞性,例如:

> if f=o(g) and g=o(h) then f=o(h)

函式的和:如果函式的上界對k個函式都適用,則對這k個函式的和也適用

if f=o(h) and g=o(h) then f+g=o(h)

如果 g=o(f) then f+g=θ

\theta

θ (f)

proof: 首先很容易由 f+g≥f 得到 f+g=ω

\omega

ω(f)

​ 已知g=o(f) 且易知f=o(f),根據第二條性質 f+g=o(f)

​ 由此,f+g=θ

\theta

θ (f)

多項式函式

通常直接取最高次項即可: 2n2+13n+8=o(n2)

對數函式

對於對數函式通常不寫底數,原因是通過換底公式很容易可以得到

logan=1/logba · logbn

我們可以很容易更換函式的底,而前面的常數項無關緊要,所以我們通常省略函式的底

可以使用取對數的方式進行比較

注意歸類,歸為多項式,對數和指數函式不同類別分別進行比較

已知 f(n)=o(g(n))

判斷對錯

做這種題目的時候,應該寫出演算法帶入計算,不能想當然的理解

解題思路:已知 f(n)≤c·g(n)

那麼有 f(n)2=c2g(n)2 故第三條正確

而另外兩條都不能滿足這樣的式子,對於第一條,當f=2,g=1時不滿足條件,對於第二條當f=4n,g=2n時不滿足條件

假設你需要知道在第幾節階梯上可以摔碎乙個瓶子,如果你採用從第一級開始往上一節節的實驗的方式,你的複雜度是o(n)且只需要乙個瓶子,如果使用二分法進行查詢,則複雜度是o(logn)但是存在的問題是會消耗更多的瓶子。

那麼假設只給你2個瓶子,你有沒有辦法用小於o(n)的時間找到瓶子摔碎的臨界高度呢?

​ 解決方案:把台階分成n1/2個區間,則每個區間的長度為n1/2,讓第乙個瓶子分別在n1/2,2n1/2,3n1/2……的高度下進行實驗直至瓶子 摔碎為止,假設瓶子在m*n1/2的高度摔碎,則用第二個瓶子在(m-1)n1/2到mn1/2的高度區間裡一級一級的進行實驗,這次實驗也最多 只需要進行n1/2次。將兩次實驗所需要的時間加和在一起,總共所需要的時間為2n1/2。滿足題目要求

那麼如果給你k>2個瓶子,你能否設計出乙個演算法,使得瓶子越多,則時間複雜度越低呢?

​ 解決方案:其實方法和上一題類似,第一次將階梯分為n1/k個區間,則每個區間的長度為nk-1/k,讓第乙個瓶子在這n1/k個區間裡進行實 驗,當確定為某個區間之後,再把這個確定的區間分成n1/k個區間,讓第二個瓶子在這些區間裡進行實驗……直到最後選定的高度就為 n1/k的區間為止,對於這k個瓶子,每個瓶子的最壞複雜度都是n1/k,則複雜度就為kn1/k。滿足條件。

演算法分析基礎 漸進時間複雜度

這裡通過從無窮大的比較來理解,漸進時間複雜度。要求具有高等數學基礎 可以從無窮大比較分析的原因 我們一般只考慮輸入規模比較大 無窮大 的情況,一般這時候t n 是很大的的。從而我們通過無窮大的階數來比較t n 和f n 的情況,無論初始情況怎麼樣,階數大的在n趨於無窮時總是會超過另乙個階數小的。當然...

演算法時間複雜度分析

定義 如果乙個問題的規模是n,解這一問題的某一演算法所需要的時間為t n 它是n的某一函式 t n 稱為這一演算法的 時間複雜性 求解演算法的時間複雜度的具體步驟是 1 找出演算法中的基本語句 演算法中執行次數最多的那條語句就是基本語句,通常是最內層迴圈的迴圈體。2 計算基本語句的執行次數的數量級 ...

演算法分析時間複雜度

對乙個演算法的分析,很多時候我們更關心演算法執行的時間複雜度。演算法的時間複雜度中,我們關心演算法執行的時間上界。即大o階分析方法。時間複雜度的分類 1 沒有迴圈遞迴的基本都是常數階。2 有一層迴圈的就是線性階。for int i 0 i dosth 3 對數階 一般類似如下 while i i i...