一般情況下,演算法中基本操作重複執行的次數是問題規模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 的增大,演算法的執行時間的...
理解均攤時間複雜度
均攤時間複雜度分析,又叫攤還分析 或者叫平攤分析 均攤時間複雜度,聽起來跟平均時間複雜度有點兒像。對於初學者來說,這兩個概念確實非常容易弄混。大部分情況下,我們並不需要區分最好 最壞 平均三種複雜度。平均複雜度只在某些特殊情況下才會用到,而均攤時間複雜度應用的場景比它更加特殊 更加有限。我還是借助乙...