時間復雜度的計算


1,
算法復雜度是在《數據結構》這門課程的第一章里出現的,因為它稍微涉及到一些數學問題,所以很多同學感覺很難,加上這個概念也不是那么具體,更讓許多同學復習起來無從下手,下面我們就這個問題給各位考生進行分析。
首先了解一下幾個概念。一個是時間復雜度,一個是漸近時間復雜度。前者是某個算法的時間耗費,它是該算法所求解問題規模n的函數,而后者是指當問題規模趨向無窮大時,該算法時間復雜度的數量級。
當我們評價一個算法的時間性能時,主要標准就是算法的漸近時間復雜度,因此,在算法分析時,往往對兩者不予區分,經常是將漸近時間復雜度T(n)=O(f(n))簡稱為時間復雜度,其中的f(n)一般是算法中頻度最大的語句頻度。
此外,算法中語句的頻度不僅與問題規模有關,還與輸入實例中各元素的取值相關。但是我們總是考慮在最壞的情況下的時間復雜度。以保證算法的運行時間不會比它更長。
常見的時間復雜度,按數量級遞增排列依次為:常數階O(1)、對數階O(log2n)、線性階O(n)、線性對數階O(nlog2n)、平方階O(n^2)、立方階O(n^3)、k次方階O(n^k)、指數階O(2^n)。
下面我們通過例子加以說明,讓大家碰到問題時知道如何去解決。
1、設三個函數f,g,h分別為 f(n)=100n^3+n^2+1000 , g(n)=25n^3+5000n^2 , h(n)=n^1.5+5000nlgn
請判斷下列關系是否成立:
(1) f(n)=O(g(n))
(2) g(n)=O(f(n))
(3) h(n)=O(n^1.5)
(4) h(n)=O(nlgn)
這 里我們復習一下漸近時間復雜度的表示法T(n)=O(f(n)),這里的"O"是數學符號,它的嚴格定義是"若T(n)和f(n)是定義在正整數集合上的 兩個函數,則T(n)=O(f(n))表示存在正的常數C和n0 ,使得當n≥n0時都滿足0≤T(n)≤C?f(n)。"用容易理解的話說就是這兩個函數當整型自變量n趨向於無窮大時,兩者的比值是一個不等於0的常 數。這么一來,就好計算了吧。
 
◆ (1)成立。題中由於兩個函數的最高次項都是n^3,因此當n→∞時,兩個函數的比值是一個常數,所以這個關系式是成立的。
◆ (2)成立。與上同理。
◆ (3)成立。與上同理。
◆ (4)不成立。由於當n→∞時n^1.5比nlgn遞增的快,所以h(n)與nlgn的比值不是常數,故不成立。
 
2、設n為正整數,利用大"O"記號,將下列程序段的執行時間表示為n的函數。
(1) i=1; k=0
while(i<n)
{ k=k+10*i;i++;
}
解答:T(n)=n-1, T(n)=O(n), 這個函數是按線性階遞增的。
(2) x=n; // n>1
while (x>=(y+1)*(y+1))
y++;
解答:T(n)=n1/2 ,T(n)=O(n1/2), 最壞的情況是y=0,那么循環的次數是n1/2次,這是一個按平方根階遞增的函數。
(3) x=91; y=100;
while(y>0)
if(x>100)
{x=x-10;y--;}
else x++;
解答: T(n)=O(1), 這個程序看起來有點嚇人,總共循環運行了1000次,但是我們看到n沒有? 沒。這段程序的運行是和n無關的,就算它再循環一萬年,我們也不管他,只是一個常數階的函數。
一個經驗規則
 
有如下復雜度關系
 
c < log2N < n < n * Log2N < n^2 < n^3 < 2^n < 3^n < n!
 
其中c是一個常量,如果一個算法的復雜度為c 、 log2N 、n 、 n*log2N ,那么這個算法時間效率比較高 ,如果是 2^n , 3^n ,n!,那么稍微大一些的n就會令這個算法不能動了,居於中間的幾個則差強人意。
 
 
2,
 
學習算法的同學,如果不知道計算一個算法的時間復雜度該如何計算,其實是一件很丟臉的事情。最近選修了高級算法這門課,由於時間緊張,原本就想混過去算了,但是不料考試的時候有40%的題目是計算時間復雜度的,干脆就好好的總結一下。
 
概念我也不講了,大家都清楚。關鍵講講怎么計算比較實際一點。
 
求解算法的時間復雜度的具體步驟是:
 
  ⑴ 找出算法中的基本語句;
 
  算法中執行次數最多的那條語句就是基本語句,通常是最內層循環的循環體。
 
  ⑵ 計算基本語句的執行次數的數量級;
 
  只需計算基本語句執行次數的數量級,這就意味着只要保證基本語句執行次數的函數中的最高次冪正確即可,可以忽略所有低次冪和最高次冪的系數。這樣能夠簡化算法分析,並且使注意力集中在最重要的一點上:增長率。
 
  ⑶ 用大Ο記號表示算法的時間性能。
 
  將基本語句執行次數的數量級放入大Ο記號中。
 
  如果算法中包含嵌套的循環,則基本語句通常是最內層的循環體,如果算法中包含並列的循環,則將並列循環的時間復雜度相加。例如:
 
  for (i=1; i<=n; i++)
  x++;
 
  for (i=1; i<=n; i++)
  for (j=1; j<=n; j++)
  x++;
 
  第一個for循環的時間復雜度為Ο(n),第二個for循環的時間復雜度為Ο(n2),則整個算法的時間復雜度為Ο(n+n2)=Ο(n2)。
 
  常見的算法時間復雜度由小到大依次為:
 
  Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)
 
Ο(1)表示基本語句的執行次數是一個常數,一般來說,只要算法中不存在循環語句,其時間復雜度就是Ο(1)。Ο(log2n)、Ο(n)、Ο(nlog2n)、Ο(n2)和Ο(n3)稱為多項式時間,而Ο(2n)和Ο(n!)稱為指數時間。計算機科學家普遍認為前者是有效算法,把這類問題稱為P類問題,而把后者稱為NP問題。
 
這只能基本的計算時間復雜度,具體的運行還會與硬件有關。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 


免責聲明!

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



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