18年網際網路寒冬,特別是遊戲行業,版號一年沒發。待經濟春暖花開之時,也讓自己在行業行業中增加競爭力。
為什麼要進行複雜度分析?
1.和效能測試相比, 複雜度分析有不依賴執行環境、 成本低、 效率高、 易操作、 指導性強的特點。
2.掌握複雜度分析, 將能編寫出效能更優的**, 有利於降低系統開發和維護成本。
時間複雜度:時間複雜度是衡量乙個演算法重要的指標之一,當資料量越大,演算法的效率也就越能體現出來,以時間複雜度為例, 由於時間複雜度描述的是演算法執行時間與資料規模的增長變化趨勢, 所以常量階、 低階以及係數實際上對這種增長趨勢不產決定性影響, 所以在做時間複雜度分析時忽略這些項。
時間負責度特點如下:
俗稱:1) 單段**看高頻: 比如迴圈。
2) 多段**取最大: 比如一段**中有單迴圈和多重迴圈, 那麼取多重迴圈的複雜度。
3) 巢狀**求乘積: 比如遞迴、 多重迴圈等
4) 多個規模求加法: 比如方法有兩個引數控制兩個迴圈的次數, 那麼這時就取二者複雜度相加。
常用的複雜度級別:
多項式階: 隨著資料規模的增長, 演算法的執行時間和空間占用, 按照多項式的比例增長。 包括,o(1)(常數階) 、 o(logn)(對數階) 、 o(n)(線性階) 、 o(nlogn)(線性對數階) 、 o(n^2)(平方階) 、 o(n^3)(立方階)。
非多項式階: 隨著資料規模的增長, 演算法的執行時間和空間占用暴增, 這類演算法效能極差。 包括,o(2^n)(指數階) 、 o(n!)(階乘階) 。
最好、平均、最壞、均攤時間複雜度:
1這段**中假如尋找的這個資料正好在陣列中下標為0的位置,時間複雜度為o(1),也就是最好時間複雜度。假如這個資料中沒有這個資料,需要把整個陣列遍歷一遍,//n 表示陣列 array 的長度
2int find(int array, int n, int
x) 10
}11 return pos;
12 }
時間複雜度為o(n)也就是最壞的時間複雜度。
考慮到這兩種情況都比較極端,假設要查詢的這個資料在陣列中和不在陣列中的的概率都為1/2,要查詢的資料出現在陣列0~n-1中的概率也是一樣的為1/n,根據概率的乘法
原則,要查詢的資料出現在0~n-1中的概率為1/2n。如果我們把每種情況發生的概率也算進入,平均時間複雜度的公式就變成這樣了:
這個值就是概率論中的加權平均值,去掉常亮和係數的結果就是o(n)所以平均時間複雜度也為o(n)。
均攤時間複雜度:
1這個演算法在比較在絕大部分情況下時間複雜度都是0(1),只有在某種極端的情況下時間複雜度才是o(n),第二個不同之處在於一都是經過乙個o(n)的插入之後在經過n-1個0(1)的插入,迴圈往復。所以可以把耗時最多一次操作,均攤到n-1個操作中,經過均攤後,這個演算法的時間複雜度就是o(1)。這就是比較少見的情況下的均攤時間複雜度。//array 表示乙個長度為 n 的陣列2//
**中的 array.length 就等於 n
3int array = new
int[n];
4int count = 0;5
void insert(int
val)
11 array[0] =sum;
12 count = 1;13
}14 array[count] =val;
15 ++count;
16 }
空間複雜度:
演算法的指標中空間複雜度也是乙個重要的指標。空間複雜度的全稱是漸進空間複雜度,表示演算法的儲存空間與資料規模之間的增長關係。
我們常見的空間複雜度就是 o(1)、 o(n)、 o(n ), 像 o(logn)、 o(nlogn) 這樣的對數階複雜度平時很少用。
時間複雜度與空間複雜度
空間複雜度 space complexity 是對乙個演算法在執行過程中臨時占用儲存空間大小的量度,記做s n o f n 比如直接 插入排序 的時間複雜度 是o n 2 空間複雜度是o 1 而一般的 遞迴演算法就要有o n 的空間複雜度了,因為每次遞迴都要儲存返回資訊。乙個演算法的優劣主要從演算法...
時間複雜度與空間複雜度
本文是對時間複雜度以及空間複雜度的乙個理解 時間複雜度 由於環境的不同,同樣的 執行所需要的時間是不同的,所以是不能拿來比較的 而函式中執行的次數確實一樣的 所以時間複雜度就是 程式每個迴圈中的語句總共會執行的次數 時間複雜度的表示方法 大o漸進表示法 o f n 這裡的f n 是什麼呢?void ...
時間複雜度與空間複雜度
本文部分取自搜狗百科 在求演算法效率時,通常有事前分析和事後分析兩種方法,事後分析因為必須實際檢驗過後才能得出答案,且可能由於硬體方面等外部原因影響結果而不被推廣,事前分析的主要就是在考量乙個演算法的基本執行次數,這就是時間複雜度。時間複雜度 一般情況下,演算法中基本操作重複執行的次數是問題規模n的...