**執行時間t(n)與執行次數n成正比,即t(n) = o(f(n)),大o表示時間複雜度,又稱漸進時間複雜度,表徵**執行時間隨資料規模增長的變化趨勢。一定程度上可以模擬斜率、導數。
1.只關注迴圈執行次數最多的**行,忽略常數
2.加法法則:總複雜度等於量級最大的那個時間複雜度
3.乘法法則:總複雜度等於巢狀的各個量級複雜度乘積
常見時間複雜度
1.多項式量級
常數階o(1)、對數階o(log n)、線性階o(n)、線性對數階o(nlog n)、乘方階o(
2.非多項式量級(隨資料規模n的增長呈爆發增長,比較低效)
指數階o(
分析方法同時間複雜度,找出占用的空間即可
// n 表示陣列 array 的長度
int find(int array, int n, int x)
return pos;
}
當第乙個array[0]滿足要求時,時間複雜度為o(1);當最後乙個滿足要求或者都不滿足要求時,時間複雜度為o(n)。
對應了最好、最壞時間複雜度
// n 表示陣列 array 的長度
int find(int array, int n, int x)
} return pos;
}
要查詢x在陣列中的哪個位置,共有n+1種情況,簡化計算的情況下,假設在陣列內和不在陣列內的情況各為1/2,那麼計算以下對應在各個位置的概率如下:
計算找到x需要執行的次數
在陣列內:1*1/2n + 2*1/2n +3*1/2n +...+ n*1/2n = n(n+1)/4n
不在陣列內:n/2
相加結果為(3n+1)/4即為平均時間複雜度
// 全域性變數,大小為 10 的陣列 array,長度 len,下標 i。
int array = new int[10];
int len = 10;
int i = 0;
// 往陣列中新增乙個元素
void add(int element)
// new_array 複製給 array,array 現在大小就是 2 倍 len 了
array = new_array;
len = 2 * len;
}// 將 element 放到下標為 i 的位置,下標 i 加一
array[i] = element;
++i;
}
假設陣列長度為n,那麼對應了n+1種情況,它們的概率是相同的。如果陣列有空間,則直接插入,複雜度o(1),如果空間不夠,就會擴容,copy原陣列,複雜度o(n)。
1*1/(n+1) + 1*1/(n+1)+...+n*1/(n+1) 最後的結果為常數,均攤時間複雜度為o(1)
對於均攤時間複雜度的另乙個分析方法是,每一次複雜度為o(n)的操作,一定對應著n-1次o(1)的操作,將o(n)分攤到各個o(1)上,最後的結果為o(1)
資料結構與演算法 複雜度分析
一 什麼是複雜度分析?1.資料結構和演算法解決是 如何讓計算機更快時間 更省空間的解決問題 2.因此需從執行時間和占用空間兩個維度來評估資料結構和演算法的效能。3.分別用時間複雜度和空間複雜度兩個概念來描述效能問題,二者統稱為複雜度。4.複雜度描述的是演算法執行時間 或占用空間 與資料規模的增長關係...
資料結構與演算法110 複雜度分析
很多人會有疑問,複雜度分為時間和空間複雜度,現在有很多任務具監控統計執行時間和占用記憶體大小,為什麼還要去分析呢?這種測試的的結果非常依賴當時的測試環境 硬體 網速等 結果還受到資料量的影響。所以我們需要通過時間空間複雜度來估計執行的效率。int sumnumber int n return sum...
資料結構與演算法 02 複雜度分析
資料結構與演算法的本身解決的是 快 和 省 的問題。節省空間,且執行效率快,今天我們通過複雜度分析來考量 的執行效率,複雜度又分為時間複雜度和空間複雜度兩大類。事後統計法 通過運用工具監控的 執行的方法,統計 的執行時間和占用空間。這種方法無法真實的反應 的效能。1.1 測試結果非常依賴測試環境 受...