王道數據結構復習(一)


  本次數據結構復習重點復習了第一章緒論中關於時間復雜度的計算。一下簡要介紹一下復習結果:

    一個語句的頻度是指該語句在算法中被重復執行的次數。算法中所有語句的頻度之和記為T(n),它是該算法問題規模n的函數,時間復雜度主要分析T(n)的數量級。算法中的基本運算(最深層循環內的語句)的頻度與T(n)同數量級,因此通常采用算法中基本運算的頻度ƒ(n)來分析算法的時間復雜度。因此,算法的時間復雜度記為:

                T(n)=Ο(ƒ(n))

  式中,Ο的含義時T(n)的數量級,其嚴格的數學定義是:若T(n)和ƒ(n)是定義在正整數集合上的兩個函數,則存在正常數C和n使得當n≥n0時,都滿足0≤T(n)≤Cƒ(n)。

  在分析一個程序的時間復雜性時,有一下兩條規則:

  a)加法規則: T(n)=T1(n)+T2(n)=Ο(ƒ(n))+O(g(n)) = O(max(ƒ(n),g(n))

  b)乘法規則:T(n)=T1(n)*T2(n)=O(ƒ(n))+O(g(n))=O(ƒ(n)*g(n))

  常見的漸進時間復雜度為:

  O(1)<O(log2n)<O(n)<O(nlog2n)<P(n2)<O(n3)<O(2n)<O(n!)<O(nn)

  以下是一些題目回顧:

  1.求下述代碼的時間復雜度

void fun (int n) {
    int i = 1;
    while (i <= n)
        i = i * 2;
}

  基本運算是

i = i * 2

  設其執行次數為t,則2t≤n,即t≤log2n,因此復雜度T(n)=O(log2n)。

  2.下列函數的時間復雜度為:

int func (int n) {
    int i = 0, sum = 0;
    while (sum < n) sum += ++i;
    return i;
}

  

sum += ++i;

  相當於

++i;
sum = sum + i;

  進行到k次循環時,sum = (1+k)*k/2。需要O(n1/2)復雜度。

  3.一個算法所需時間由下述遞歸方程表示,試求出該算法時間復雜度級別:

  T(n)=1 當n=1;

  T(n)=2T(n/2)+n 當n>1;

  式中,n是問題規模,為簡單起見,設n是2的整數次冪。

  此題目可以使用主定理解決。當T(n)=aT(n/b)+ƒ(n)時:1)ƒ(n)=O(nlogab-ε)  ε>0  T(n)=θ(nlogba)    2) ƒ(n)=θ(nlogba) 那么 T(n)=θ(nlogbalog2n)     3)ƒ(n)=Ω(nlogba+ε)且對C≤1有充分大的n有aƒ(n/b)≤Cƒ(n)  T(n)=θ(ƒ(n))。

  滿足主定理2),因此復雜度O(nlog2n).

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM