【數據結構實戰C++】6 算法效率的度量
作者 CodeAllen ,轉載請註明出處
常見的時間複雜度
常見時間複雜度的比較
O(1)< O(logn)<O(n)<O(n*logn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)
基本身算法時間複雜度是O(2n)O(n!)O(nn)
的時候,運行時間就是不可接受的了
實例分析
分最好情況和最壞情況
一般沒有特殊說明,分析算法的時間複雜度都是指最壞時間複雜度
算法的空間複雜度(space complexity)
-S(n) = S(f(n))
n爲算法的問題規模
f(n)是空間使用函數,與n有關
空間複雜度實例
所需要的單位內存 : n +4
空間複雜度 :S(n + 4) = S(n)
空間與時間的策略
- -多數情況下,算法的時間複雜度更關注
- -有必要的話,可以通過增加額外的空間降低時間複雜度
- -同理,也可以通過增加算法的耗時降低空間複雜度
實例分析:空間換時間
/*
問題:
在一個由自然數1-1000中某些數字所組成的數組中,每個數字可能出現零次或者多次。
設計一個算法,找出出現次數最多的數字。
*/
#include <iostream>
using namespace std;
void search(int a[], int len) // O(n)
{
int sp[1000] = {0};
int max = 0;
for(int i=0; i<len; i++) //遍歷數組元素,作爲下表統計,空間換時間
{
sp[a[i] - 1]++;
}
for(int i=0; i<1000; i++)
{
if( max < sp[i] )
{
max = sp[i];
}
}
for(int i=0; i<1000; i++)
{
if( max == sp[i] )
{
cout << i + 1 << endl;
}
}
}
int main(int argc, char* argv[])
{
int a[] = {1, 1, 3, 4, 5, 6, 6, 6, 3, 3};
search(a, sizeof(a)/sizeof(*a));
return 0;
}
面試題:當兩個算法的的大O表示法相同時,是夠意味着兩個算法的效率完全一樣?
只能說明是同一個級別的,但是不能說明複雜度相同
小結
一般工程中,時間複雜度不超過0(n^3)
算法分析中,重點考慮的是最壞時間複雜度,時間複雜度也是最關注的
大O表示法童謠適合算法的空間複雜度
空間換時間是工程中經常用的策略