2021-05-12 14:32:11
演演算法的空間複雜度
2020-10-31 09:30:07
續上節《--演演算法的時間複雜度--》https://www.cnblogs.com/nbk-zyc/p/12293186.html
1 演演算法的時間複雜度
常見演演算法的時間複雜度
常見演演算法的時間複雜度比較:
時間複雜度的案例分析:
1 #include <iostream> 2 3 using namespace std; 4 5 /** 6 * 功能: 查詢陣列下標並返回 7 * 引數: 8 * a[]: 輸入資料 9 * n:陣列長度 10 * v:待查詢的元素 11 * 返回值:待查詢元素的陣列下標 12 */ 13 int find(int a[], int n, int v) 14 { 15 int ret = -1; 16 17 for(int i = 0; i < n; i++) // O(n) 18 { 19 if( a[i] == v) 20 { 21 ret = i; 22 break; 23 } 24 } 25 26 return ret; 27 } 28 29 30 31 int main(int argc, char* argv[]) 32 { 33 int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 34 int length = sizeof(arr)/sizeof(int); 35 int min = find(arr, length, 1); // 最好情況,演演算法執行1次,O(1) 36 int max = find(arr, length, 10); // 最差情況,演演算法執行10次,O(10) 37 38 return 0; 39 }
結論:一般來說,演演算法的時間複雜度需要考慮其最壞的情況,因為只有這樣,才能滿足其最好情況和平均情況。(上節內容都是基於演演算法的時間複雜度的最壞情況考慮的)
2 演演算法的空間複雜度(Space Complexity)
1) 定義:
對一個演演算法在執行過程中臨時佔用儲存空間大小的度量,記作 S(n) = S(f(n)) --- 可以使用 演演算法的時間複雜度 來估算 演演算法的空間複雜度(記憶體分配)
n: 問題規模
f(n):空間使用函數, 與 n 有關
2)程式碼展示:
1 // sum1() 空間複雜度 = n+4 2 long sum1(int n) // 1 3 { 4 long ret = 0; // 1 5 int* array = new int[n]; // n 6 7 for(int i=0; i<n; i++) // 1 8 { 9 array[i] = i + 1; 10 } 11 12 for(int i=0; i<n; i++) // 1 13 { 14 ret += array[i]; 15 } 16 17 delete[] array; 18 19 return ret; 20 }
3)空間與時間的策略
1. 通常演演算法的時間複雜度更讓人關注;
2. 如果有必要,可以通過增加額外空間來降低時間複雜度;(空間換時間)
3. 同樣,也可以通過增加演演算法的耗時來換取空間複雜度;(時間換空間)
1 /* 2 問題: 3 在一個由自然數1-1000中某些數位所組成的陣列中,每個數位可能出現零次或者多次。 4 設計一個演演算法,找出出現次數最多的數位。 5 */ 6 7 #include <iostream> 8 9 using namespace std; 10 11 int search(int a[], int len) 12 { 13 int sp[1000] = {0}; // 初始化每個自然數出現的次數,陣列下標加1代表當前的自然數 14 int max = 0; // 儲存自然數出現次數的最大值 15 int ret = 0; // 儲存出現次數最多的自然數 16 17 for(int i=0; i<len; i++) 18 { 19 sp[a[i] - 1]++; // 標記自然數的出現次數 20 } 21 22 for(int i=0; i<1000; i++) 23 { 24 if( max < sp[i] ) 25 { 26 max = sp[i]; 27 } 28 } 29 30 for(int i=0; i<1000; i++) 31 { 32 if( max == sp[i] ) 33 { 34 ret = i + 1; 35 break; 36 } 37 } 38 39 return ret; 40 } 41 42 int main(int argc, char* argv[]) 43 { 44 int a[] = {1, 1, 3, 4, 5, 6, 6, 6, 3, 3, 6}; 45 46 int ret = search(a, sizeof(a)/sizeof(*a)); 47 48 cout << ret << endl; 49 50 return 0; 51 }
程式碼中核心思想:
思考題:當兩個演演算法的大O表示法相同時,是否意味著這兩個演演算法效率完全相同?
答:兩個演演算法的大O表示法相同,只代表這兩個演演算法效率的數量級相同。
重點提示:
1)一般而言,工程中使用的演演算法,時間複雜度不超過O(n3);
2)演演算法分析與設計時,重點考慮最壞情況下的時間複雜度;
3)大O表示法同樣適用於演演算法的空間複雜度;
4)空間換時間是工程開發中常用的策略。
相關文章