時間復雜度數量級分析


時間復雜度數量級分析

“大 O記法:在這種描述中使用的基本參數是 n,即問題實例的規模,把復雜性或運行時間表達為n的函數。 

注意:“O”表示量級 (order),比如說“二分檢索是 O(logn)的”,也就是說它需要“通過logn量級的步驟去檢索一個規模為n的數組”記法 O ( f(n) )表示當 n增大時,運行時間至多將以正比於 f(n)的速度增長。 

這種漸進估計對算法的理論分析和大致比較是非常有價值的,但在實踐中細節也可能造成差異。例如,一個低附加代價的O(n2)算法在n較小的情況下可能比一個高附加代價的 O(nlogn)算法運行得更快。當然,隨着n足夠大以后,具有較慢上升函數的算法必然工作得更快。 

O(1) 

Temp=i;i=j;j=temp; 

分析: 

     以上三條單個語句的頻度均為1,該程序段的執行時間是一個與問題規模n無關的常數。 

     算法的時間復雜度為常數階,記作T(n)=O(1)。 

     這里的1不是1,只是表示一個常數; 

     如果算法的執行時間不隨着問題規模n的增加而增長,即使算法中有上千條語句,其執行時間也不過是一個較大的常數。此類算法的時間復雜度是O(1)。

 

O(n2) 

2.1. 交換i和j的內容 

sum=0; (一次) 

for(i=1;i<=n;i++) (n次 ) 

for(j=1;j<=n;j++) (n2次 ) 

sum++; (n2次 ) 

解:T(n)=2*n2+n+1 =O(n2)

 

2.2. 

for (i=1;i<n;i++)(n-1次) 

{ 

y=y+1; //1 

for (j=0;j<=(2*n);j++)(2*n+1次) 

x++; //2 

} 

解: 語句1的頻度是n-1 

      語句2的頻度是(n-1)*(2*n+1)=2*n2-n-1 

      f(n)=2*n2-n-1+(n-1)=2*n2-2 

      該程序的時間復雜度T(n)=O(n2).

  

O(n) 

2.3. 

a=0; 

b=1;                              //1 

for (i=1;i<=n;i++)      //2 

{ 

s=a+b;            //3 

b=a;             //4 

a=s;             //5 

}

 

解: 語句1的頻度:2, 

      語句2的頻度: n, 

      語句3的頻度: n-1, 

      語句4的頻度:n-1, 

      語句5的頻度:n-1, 

      T(n)=2+n+3(n-1)=4n-1=O(n).

 

O(log2n ) 

2.4. 

i=1;          //1 

while (i<=n) 

i=i*2;      //2 

解: 語句1的頻度是1, 

      設語句2的頻度是f(n), 則:2f(n)<=n;  f(n)<=log2n 

      取最大值f(n)= log2n, 

      T(n)=O(log2n )

 

O(n3) 

2.5. 

for(i=0;i<n;i++) 

{ 

  for(j=0;j<i;j++) 

  { 

     for(k=0;k<j;k++) 

          x=x+2; 

  } 

} 

解: 當i=m, j=k的時候,內層循環的次數為k當i=m時, j 可以取 0,1,...,m-1 , 所以這里最內循環共進行了0+1+...+m-1=(m-1)m/2次 ,所以i從0取到n, 則循環共進行了: 

       0+(1-1)*1/2+...+(n-1)n/2=n(n+1)(n-1)/6所以時間復雜度為O(n3). 

    我們還應該區分 算法的最壞情況的行為和期望行為。如快速排序的最壞情況運行時間是 O(n2),但期望時間是 O(nlogn)。通過每次都仔細地選擇基准值,我們有可能把平方情況 (即O(n2)情況)的概率減小到幾乎等於 0。在實際中,精心實現的快速排序一般都能以 (O(nlogn)時間運行。

 

下面是一些常用的記法: 

    訪問數組中的元素是常數時間操作,或說O(1)操作。一個算法 如 果能在每個步驟去掉一半數據元素,如二分檢索,通常它就取 O(logn)時間。用strcmp比較兩個具有n個字符的串需要O(n)時間。常規的矩陣乘算法是O(n3),因為算出每個元素都需要將n對元素相乘並加到一起,所有元素的個數是n2 

    指數時間算法通常來源於需要 求出所有可能結果。例如,n個元素的集合共有2n個子集,所以要求出所有子集的算法將是O(2n)的。指數算法一般說來是太復雜了,除非n的值非常小,因為,在 這個問題中增加一個元素就導致運行時間加倍。不幸的是,確實有許多問題 (如著名的“巡回售貨員問題” ),到目前為止找到的算法都是指數的。如果我們真的遇到這種情況,通常應該用尋找近似最佳結果的算法替代之。

 

技巧1: 

For(i=1; i<n; i*=2) 

{ 

} 

那么這個程序片段的時間復雜度就是:O(log2n);

  


免責聲明!

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



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