終於放寒假了,鬆下一口氣的博主能夠專心地更新博客了,但願寒假能有更大的進步!
本系列在於記載個人算法學習筆錄,強化學習,廢話很少說,開始吧。html
來源c++
算法的執行時間與代碼的執行次數成正比,用 T(n) = O(f(n)) 表示,其中T(n)表示算法執行總時間,f(n)表示每行代碼執行總次數,而n每每表示數據的規模。算法
特色數組
以時間複雜度爲例,因爲時間複雜度描述的是算法執行時間與數據規模的增加變化趨勢,因此常量階、低階以及係數實際上對這種增加趨勢不產生決定性影響。因此在作時間複雜度分析時忽略這些項。數據結構
複雜度量級:數據結構和算法
多項式階:隨着數據規模的增大,算法的執行時間和空間佔用,按照多項式的比例增加。包括:ide
O(1) 、O(logn)、O(n) 、O(nlogn) 、O(n^2)... O(n^k).性能
非多項式階:隨着數據規模的增大,算法的執行時間和空間佔用暴增(NP問題),這類算法性能極差。學習
O(2^n) 、O(n!)測試
首先咱們要引入幾個概念:最好狀況時間複雜度(best case time complexity)、最壞狀況時間時間按複雜度(worst case time complexity)、平均狀況時間複雜度 (average case time complexity)、均攤時間複雜度(amortized time complexity)。
例子:
// 全局變量,大小爲 10 的數組 array,長度 len,下標 i。
int array[] = new int[10];
int len = 10;
int i = 0;
// 往數組中添加一個元素
void add(int element) {
if (i >= len) { // 數組空間不夠了
// 從新申請一個 2 倍大小的數組空間
int new_array[] = new int[len*2];
// 把原來 array 數組中的數據依次 copy 到 new_array
for (int j = 0; j < len; ++j) {
new_array[j] = array[j];
}
// new_array 複製給 array,array 如今大小就是 2 倍 len 了
array = new_array;
len = 2 * len;
}
// 將 element 放到下標爲 i 的位置,下標 i 加一
array[i] = element;
++i;
}
該算法的最好狀況時間複雜度(best case time complexity)爲O(1);
最壞狀況時間複雜度(worst case time complexity)爲O(n);
均攤時間複雜度 (amortized time complexity) 爲O(1);
以上爲本篇內容,如有不足之處,請諸位多多包涵,斧正。筆者在此謝過。