數據結構算法——算法復雜度分析
算法復雜度分為時間復雜度和空間復雜度
首先要清楚一點,大O表示法的時間復雜度高不代表程序運行時間長,空間復雜度高不代表占用空間多。
他們表示的是代碼執行時間隨著數據規模增長的變化趨勢。和算法儲存空間與數據規模之間的增長關系。
時間復雜度判斷方法
1、只關註循環次數最多的一段代碼
2、加法法則:總復雜度等於量級最大的那段代碼的復雜度
3、乘法原則:嵌套代碼的復雜度等於嵌套內外代碼復雜度的乘積
常見的復雜度量級(按數量級遞增)
常量階:O(1)
對數階:O(logn)
線性階:O(n)
線性對數階:O(nlogn)
平方階:O(n2)
...
k次方階:O(nk)
指數階:O(2n)
階乘階:O(n!)
實戰分析幾個常見的復雜度
1,O(1)
int i=8; int j=6; int sum=i+j;
這個的復雜度是O(1)而不是O(3),代表算法復雜度不隨n的變化而變化
2,O(logn),O(nlogn)
i=1; while(i<=n) { i=i*2; }
這段代碼循環次數應該是log2n。不管底數是幾,都可以記為O(logn),因為log2n=log210*log10n。也就是都可以互相線性轉化。直接略去。如果再讓這個程序運行n遍,他就是O(nlogn)
3,O(m+n),O(m*n)
int cal(int m, int n) { int sum_1 = 0; int i = 1; for (; i < m; ++i) { sum_1 = sum_1 + i; } int sum_2 = 0; int j = 1; for (; j < n; ++j) { sum_2 = sum_2 + j; } return sum_1 + sum_2; }
只看循環次數最多的,總共循環了m+n次,這個代碼就可以用O(m+n)
綜上,利用那三個判斷方法,很容易就可以判斷。
空間復雜度的判斷也一模一樣。
再來理解幾個概念
最好情況復雜度,最壞情況復雜度,平均時間復雜度,均攤時間復雜度
//n 表示數組 array 的長度 int find(int[] array, int n, int x) { int i = 0; int pos = -1; for (; i < n; ++i) { if (array[i] == x) { pos = i; break; } } return pos; }
看這個代碼,程序的運行次數跟數組裏的值有關,可能運行一次就結束了,也可能運行n次才結束。取決於數組裏存的值的排列。
這就顯而易見的區分出了最好情況復雜度和最壞情況復雜度。
平均時間復雜度也就可以定義為運行的次數乘以這種情況的概率的和。也就是運行次數的期望值。
均攤時間復雜度使用的局限性很大。
比如一個函數又一次運行的復雜度是O(n),但是又有n-1次運行的復雜度是O(1)。這樣的話把O(n)的復雜度均攤到n-1個O(1)上。所以他的均攤時間復雜度就還是O(1)
正在跟著一個數據結構算法課程學習,國慶出去玩已經拉下三節課了,我這兩天盡快補回來,及時歸納總結。
數據結構算法——算法復雜度分析