求解演算法的時間複雜度,步驟如下:
(1)找出演算法中的基本語句:
演算法中執行次數最多的那條語句就是基本語句,通常是最內層迴圈的迴圈體
(2)計算基本語句的執行次數的數量級
只需要計算基本語句執行次數的數量級,這就意味著只要保證基本語句執行次數的函式中的最高次冪正確即 可,可以忽略所有低次冪和最高次冪的係數,這要能夠簡化演算法分析,並且使注意力集中在最重要的一點上:增長率 。
(3)用大0記號表示演算法的時間效能
將基本語句執行次數的數量級放入放入大0記號中
如果演算法中包含巢狀的迴圈,則基本語句通常是最內層的迴圈體,如果演算法中包含並列的迴圈體,則將並列 的時間複雜度相加。例如:
for(i=1;i<=n;i++)
x++;
for(j=1;j<=n;j++)
for(i=1;i<=n;i++)
x++;
第乙個for迴圈的時間複雜度為0(n),第二個for迴圈的時間複雜度為0(n2),則整個演算法的時間複雜度為 0(n+n^2)=0(n^2)
常見的演算法複雜度由小到大依次為:
0(1)<0(log2n)<0(n)<0(nlog2n)<0(n2)<(n3)<···<0(2n)<0(n!)
0(1)表示基本語句的執行次數是乙個常熟,一般來說只要演算法中不存在迴圈語句,其時間複雜度就為0(1).
0(log2n)、0(n)、0(nlog2n)、0(n2)和0(n3)稱為多項式時間,而0(2n)和0(n!)稱為指數時間。
計算機科學家認為前者是有效演算法,這類問題成為p(多項式)類問題,而把後者稱為np(非確定多項式)類問題
在計算演算法時間複雜度時有以下幾個簡單的程式分析法則:
(1).對於一些簡單的輸入輸出語句或賦值語句,近似認為需要0(1)時間
(2).對於順序結構,需要依次執行一系列語句所用的時間可採用大0下(求和法則)
求和法則:是指若演算法的2個部分時間複雜度分別為t1(n)=0(f(n))和t2(n)=0(g(n)),則t1(n)+t2(n)=0 (max(f(n),g(n))).t特別的,若t1(m)=0(f(m)),t2(n)=0(g(n)),則t1(m)+t2(n)=0(f(m)+g(n))
(3).對於選擇結構,如if語句,它的主要時間耗費都在執行then語句或需注意的是檢驗條件也需要0(1)時間
(4).
對於迴圈結構,迴圈語句的執行時間主要體現在多次迭代中執行迴圈體以及檢驗迴圈條件的時間耗費, 一般可以大0下(乘法法則)
乘法法則:是指若演算法的2個部分時間複雜度分別為t1(n)=0(f(n))和t2(n)=0(g(n)),則t1*t2=0(f(n)*g(n))
(5). 對於複雜的演算法,可以將它分成幾個容易估算的部分,然後利用求和法則和乘法法則計算整個演算法的時間複雜度
另外還有以下兩個運算法則:
(1)若g(n)=0(f(n)),則0(f(n))+0(g(n))=0(f(n))
(2)0(cf(n))=0(f(n)),其中c是乙個正整數
幾個常見的時間複雜度進行示例說明
(1)、o(1)
temp=i; i=j; j=temp;
以上三條單個語句的頻度均為1,該程式段的執行時間是乙個與問題規模n無關的常數。演算法的時間複雜度為常數階,記作t(n)=o(1)。注意:如果演算法的執行時間不隨著問題規模n的增加而增長,即使演算法中有上千條語句,其執行時間也不過是乙個較大的常數。此類演算法的時間複雜度是o(1)。
(2)、o(n2)
交換i和j的內容
1.sum=0;(一次)
2.for(i=1;i<=n;i++) (n+1次)
3.for(j=1;j<=n;j++)(n(n+1)次)
4.sum++;(n(n+1)+1次)
因為(2n2+n+1)=n2(即:去低階項,去掉常數項,去掉高階項的常參得到),所以t(n)= =o(n2);
一般情況下,對步進迴圈語句只需考慮迴圈體中語句的執行次數,忽略該語句中步長加1、終值判別、控制轉移等成分,當有若干個迴圈語句時,演算法的時間複雜度是由巢狀層數最多的迴圈語句中最內層語句的頻度f(n)決定的。
(3)、o(n)
1.a=0;
2.b=1; ①
3.for (i=1;i<=n;i++) ②
4. ⑤
語句1的頻度為2,語句2的頻度為n,語句3的頻度為n-1,語句4的頻度為n-1,語句5的頻度為n-1, 即t(n)=2+n+3(n-1)=4n-1=o(n).
(4)、o(log2n)
1. i=1; ①
2. while (i<=n)
3. i=i*2; ②
語句1的頻度是1,設語句2的頻度是f(n),則:2^f(n)<=n;f(n)<=log2n,取最大值f(n)=log2n,即t(n)=o(log2n)
(5)、o(n3)
1. for(i=0;i
} 當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).
時間複雜度計算
定義 如果乙個問題的規模是n,解這一問題的某一演算法所需要的時間為t n 它是n的某一函式 t n 稱為這一演算法的 時間複雜性 當輸入量n逐漸加大時,時間複雜性的極限情形稱為演算法的 漸近時間複雜性 我們常用大o表示法表示時間複雜性,注意它是某乙個演算法的時間複雜性。大o表示只是說有上界,由定義如...
時間複雜度計算
1,演算法複雜度是在 資料結構 這門課程的第一章裡出現的,因為它稍微涉及到一些數學問題,所以很多同學感覺很難,加上這個概念也不是那麼具體,更讓許多同學複習起來無從下手,下面我們就這個問題給各位考生進行分析。首先了解一下幾個概念。乙個是時間複雜度,乙個是漸近時間複雜度。前者是某個演算法的時間耗費,它是...
計算時間複雜度
求解演算法的時間複雜度的具體步驟是 找出演算法中的基本語句 演算法中執行次數最多的那條語句就是基本語句,通常是最內層迴圈的迴圈體。計算基本語句的執行次數的數量級 只需計算基本語句執行次數的數量級,這就意味著只要保證基本語句執行次數的函式中的最高次冪正確即可,可以忽略所有低次冪和最高次冪的係數。這樣能...