時間複雜度簡明理解

2021-08-29 18:45:26 字數 1762 閱讀 4805

一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t(n)表示,若有某個輔助函式f(n),使得當n趨近於無窮大時,t(n)/f(n)的極限值為不等於零的常數,則稱f(n)是t(n)的同數量級函式。記作t(n)=o(f(n)),稱o(f(n))為演算法的漸進時間複雜度(o是數量級的符號 ),簡稱時間複雜度。

時間複雜度

常見的時間複雜度

計算出t(n)的數量級

用大o來表示時間複雜度

例:

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

}//則有 t(n)= n^2+n^3,根據上面括號裡的同數量級,我們可以確定 n^3為t(n)的同數量級則有f(n)= n^3,然後根據t(n)/f(n)求極限可得到常數c則該演算法的 時間複雜度:t(n)=o(n^3)

(1) for(i=1;i<=n;i++)     //迴圈了n*n次,當然是o(n^2)

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

s++;

(2)for(i=1;i<=n;i++)   //迴圈了(n+n-1+...+1)≈(n^2)/2 ,同上

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

s++;

(4)   i=1;k=0;

while(i<=n-1)//迴圈了//n-1≈n次,所以是o(n)

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

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

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

x=x+1;//迴圈了(1^2+2^2+3^2+...+n^2)=n(n+1)(2n+1)/6≈(n^3)/3,//即o(n^3)

(6)x=91; y=100;

while(y>0) if(x>100)

else x++;//t(n)=o(1),與n無關

(7)i=n-1;

while(i>=0&&(a[i]!=k))

i--;

return i;

//此演算法中的語句(3)的頻度不僅與問題規模n有關,還與輸入例項中a的各元素取值及k的取值有關: ①若a中沒有與k相等的元素,則語句(3)的頻度f(n)=n; ②若a的最後乙個元素等於k,則語句(3)的頻度f(n)是常數0。

例1:    

int sum = 0, n = 100; /*執行一次*/

sum = (1 + n) * n / 2; /*執行一次*/

printf("%d",sum); /*執行一次*/

int i;      

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

int count = 1;      

while (count < n)

int i, j;      

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

}

int i, j;      

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

}

等差數列

int i, j;      

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

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

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

理解時間複雜度

本篇概念皆是關於時間複雜度 首先需要了解乙個概念 乙個演算法中的語句執行次數稱為語句頻度或時間頻度。記為 t n 乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多 n 稱為問題的規模,當 n 不斷變化時,時間頻度 t n 也會不斷變化。但有時我們想知道...

概念理解 時間複雜度 空間複雜度

一.時間複雜度 time complexity 在進行演算法分析時,語句總執行次數t n 是關於問題規模 n 的函式。進而分析執行次數t n 隨規模 n 的變化情況並確定t n 的數量級。演算法的時間複雜度就是演算法的時間度量,記作t n o f n 它表示隨問題規模 n 的增大,演算法的執行時間的...

理解均攤時間複雜度

均攤時間複雜度分析,又叫攤還分析 或者叫平攤分析 均攤時間複雜度,聽起來跟平均時間複雜度有點兒像。對於初學者來說,這兩個概念確實非常容易弄混。大部分情況下,我們並不需要區分最好 最壞 平均三種複雜度。平均複雜度只在某些特殊情況下才會用到,而均攤時間複雜度應用的場景比它更加特殊 更加有限。我還是借助乙...