简单分析算法的时间复杂度
目錄
一.什么是算法的時間復雜度
二.如何分析一個算法的時間復雜度
1.有確定次數的算法
2.次數不確定的算法
一.什么是算法的時間復雜度
????????時間復雜度是一個函數 ,定性描述一個算法(程序)的運行時間。它可以是漸近的,亦即考察輸入值大小趨近無窮時的情況。正常情況下,完成相同的任務的時間復雜度越低,算法越優。
? ? ? ? 比如 求從1到100的和的兩種方法 的時間復雜度:
int i,sum = 0, n = 100; for (i = 1; i <=n; i++){sum += i; } printf ("%d", sum);-時間復雜度為O(n)-
int sum = 0, n = 100; sum = (1 + n) * n/2; printf ("%d", sum);-時間復雜度為O(1)-
????????大O記法:用大寫O()來體現算法時間復雜度的記法叫大O記法。
二.如何分析一個算法的時間復雜度
? ? ? ? 大O階推推導法三個步驟:
????????(1).用常數1取代運行時間中所有加法常數。
? ? ? ? (2).在修改后的運行次數函數中,只保留最高階項。
? ? ? ? (3).如果最高階項存在且其系數不是1,則去除與這個項相乘的系數。
? ? ? ? -得到的結果就是大O階。(只看文字有些難以理解,可以先看看后面的實例)
針對時間復雜度,我將算法分為有確定次數和次數不確定的算法。
下面從兩個方面分析幾個實例:( f(n)表示程序運行的次數?)
1.有確定次數的算法
-常數階-
int sum = 0, n = 100; sum = (1 + n) * n/2; printf ("%d", sum);? ? ? ? 這個算法的f(n)為3,根據法(1)其時間復雜度為O(1)。
常數項對函數的增長速度影響并不大,所以當 f(n) = c,c 為一個常數的時候,我們說這個算法的時間復雜度為 O(1);如果 T(n) 不等于一個常數項時,直接將常數項省略。
-線性階-
int i; for (i = 0; i < n; i++){/*時間復雜度為O(1)的程序*/ }這個算法的f(n)為n,故其時間復雜度為O(n)。
-對數階-
int count = 1; while (count < n) {count = count * 2;/*時間復雜度為O(1)的程序*/ }由于2^x=n得到x=(log2)n。所以f(n)為(log2)n,其時間復雜度為O(logn)。
-平方階-
int i,j; for (i = 0; i < n; i++) {for (j = 0; j < n; j++){/*時間復雜度為O(1)的程序*/ } }這是個嵌套循環,可以成將時間復雜度為O(n)的語句執行了n次。故其時間復雜度為(n^2)。
若外循環次數改為m,則時間復雜度變為(m*n)。
int i,j; for (i = 0; i < n; i++) {for (j = i; j < n; j++) /*此處0換成i*/ {/*時間復雜度為O(1)的程序*/ } }而對于這個算法,其f(n)=n+(n-1)+(n-2)...+1=n(n+1)/2=(n^2)/2+n/2。
我們知道高次項對于函數的增長速度的影響是最大的。n^2?的增長速度是遠超 n的,因為要求的精度不高,所以直接忽略較低項n/2。
又因為函數的階數對函數的增長速度的影響是最顯著的,所以忽略與最高階相乘的常數1/2。
方法(1):沒有加法常數不予考慮;(2):只保留最高項,故保留(n^2)/2;(3):去除項的系數1/2。
故其時間復雜度為O(n^2)。
-再舉例,若一個算法的f(n)=(n^3)*3/2+(n^2)*3/2+n+5時,根據推導大O階法其時間復雜度為O(n^3)。
-其他情況-
int i, j, sum = 0, n = 100; for (i = 1; i <=n; i++){sum += i; } printf ("%d\n", sum); for (i = 1; i <=n; i++){for(j = 1; j <=n; j++){sum+=i*j;} }對于順序執行的語句或者算法,總的時間復雜度等于其中最大的時間復雜度。
此時時間復雜度為 max(O(n^2), O(n)),即 O(n^2)。
常見的時間復雜度所耗費的時間從大到小依次是:
????????O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
2.次數不確定的算法
? ? ? ? 最壞情況與平均情況:若要查找一個有n個隨機數字數組中的某個數字,最好的情況第一個數字就是,那么算法的時間復雜度為O(1),最壞的情況是最后一個,則時間復雜度為O(n)。而平均運行時間為查找n/2次后發現目標元素。平均運行時間是所有情況中最有意義的,因為它是期望的運行時間。但現實是平均運行時間很難通過分析得到,所以在沒有特殊說明的情況下,提到的時間復雜度都指最壞時間復雜度。
-冒泡排序-
int a[n] = {}; for (int i = 0; i < n - 1; i++) {for (int j; j < n-i-1; j++){if (a[j] > a[j+1]) swap(a[j],a[j+1]); /*swap已定義好*/} }最壞的情況即待排序列為逆序時,f(n)=1+2+3...+(n-1)=n*(n-1)/2次,故其時間復雜度為O(n^2)。
總結
以上是生活随笔為你收集整理的简单分析算法的时间复杂度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 11.10错题集(7-函数)
- 下一篇: 记录四个字符串函数