如何衡量**的效率?時間和空間複雜度分析。(這個是資料結構和演算法的重中之重)
資料結構和演算法的作用主要是用來解決「快」和「省」的問題。即如何讓**執行的更快,如何讓**更節省記憶體空間。執行效率是一項非常重要的考量指標。而我們可以時間、空間複雜度分析**的執行效率。
事後統計法
我們可以跑一遍**,通過統計、監控,就能得到演算法執行的時間佔比,記憶體大小。這種分析方法叫做事後統計法。而這種統計方法有兩個明顯的缺陷
缺陷一:測試環境非常依賴測試環境。
缺陷二:測試結果受資料規模的影響很大
雖然缺陷,但其評估演算法執行效率是完全正確的。而我們需要乙個不用具體測試資料來測試,就可以粗略地估計演算法執行效率地方法。也就是大o統計法
大o統計法
t(n) = o(f(n))
其中t(n)表示所有**地執行時間,f(n)表示每行**地執行總和,n表示資料規模地大小,o表示**執行時間t(n)和f(n)表示式成正比
大o時間複雜度表示**執行時間隨資料規模增長地變化趨勢,所以也稱之為漸進時間複雜度,簡稱時間複雜度
注:大o時間複雜度並不表示**地具體執行時間
時間複雜度分析:
1、只關注迴圈執行次數最多地一段**
原因:大o複雜度表示的是一種變化趨勢,隨著規模的增長,常量、低階、係數,對其影響越來越小,以至於可以忽略。
2、加法法則:總複雜度等於量級最大的那段**的複雜度
3、乘法法則:巢狀**的複雜度等於巢狀內外**複雜度的乘積
複雜度量級
空間複雜度
空間複雜度表示演算法的儲存空間與資料的規模之間的增長關係
常用的複雜度有:
複雜度分析的另外四個方面的知識點:最好情況時間複雜度、最壞情況時間複雜度、平均情況時間複雜度,均攤時間複雜度。
最好情況時間複雜度就是,在最理想的情況下,執行這段**的時間複雜度
最壞情況時間複雜度就是,在最糟糕的情況下,執行這點**的時間複雜度
均攤時間複雜度是一種特殊的平均情況時間複雜度
這個上**說明一下:在無序的陣列中,查詢變數x的值
public int find(int array,int n,int x){
int i=0;
int pos=-1;
for(;i最好的情況:毫無疑問,第一元素就是你要查詢的元素,時間複雜度為o(1)
最壞的情況:最後乙個元素才是你要查詢的元素,時間複雜度為o(n)
平均時間複雜度:要查詢x在陣列中的位置,有n+1種情況:在陣列的0~n-1位置中和不在陣列中。我們需要把每種情況相加,然後除以n+1。第乙個位置的,找到只需遍1次,第二位置,找到需要遍歷2次,依次類推,在第n個位置需要遍歷n次,不在陣列中的情況需要遍歷n次,就可以得到下面的公式:
忽略係數、低階、常量。可以得到平均時間複雜度為o(n)。
均攤時間複雜度就不再詳解了。實際應用中有乙個場景,就是陣列的動態擴容,也就是當往陣列中新增元素,當陣列沒有足夠的記憶體空間時,需要給陣列擴容的場景。這個場景也可以使用平均時間複雜度分析
總結:經常使用複雜度分析自己寫的**,很快就能夠掌握
參考:資料結構之美 --王爭
資料結構和演算法 複雜度分析
演算法的執行效率,粗略的講就是演算法的執行時間,那麼如何在不執行 的情況下,估算 的執行時間呢 我們先看乙個簡單的求和 1 int cal int n 7 return sum 8 從cpu的角度來看,每一行 都做著相同的工作,讀資料 計算 寫資料,儘管每行 對應的cpu的執行個數,執行時間都不一樣...
資料結構和演算法 複雜度
演算法複雜度 1 時間複雜度 表示演算法的執行時間與資料規模之間的增長關係 1 只關注迴圈執行次數最多的一段 2 加法法則 總複雜度等於量級最大的那段 的複雜度 3 乘法法則 巢狀 的複雜度等於巢狀內外 複雜度的乘積 幾種常見時間複雜度例項分析 最好 最壞 平均 均攤時間複雜度要根據具體的演算法進行...
1 1資料結構 演算法複雜度分析
1 演算法時間複雜度分析 1 原操作 定義語句 賦值語句 輸入輸出語句 即非迴圈 順序 分支等控制結構 2 頻度 tn 原操作執行的次數 4 演算法時間複雜度o n 頻度的數量級 5 問題規模n 把任何要解決的問題的輸入都轉化成乙個陣列,那麼陣列長度就是問題規模。6 o 1 即常數階,乙個演算法中沒...