我們先來看一下下面這段**
但是這段**明顯還有優化的空間,如果我們在陣列中間尋找到x的話,就不需要把整個陣列都迴圈一邊了,所以可以優化為下面這段**。
如果在這種情況下的話,就不能用上一次所說到的方法來衡量了,因為我們不知道需要尋找的x所在的位置在**,如果在第乙個的話,它的時間複雜度就是o(1),如果這個陣列裡沒有的話,就需要全部遍歷一遍,它的時間複雜度就是o(n),這裡就需要引入最好時間複雜度和最壞時間複雜度
顧名思義,最好時間複雜度就是在最理想的狀態下的時間複雜度,就是我們前面說的,所需要找的x恰好是陣列的第乙個字元,時間複雜度為o(1)
最壞時間複雜度就是在最糟糕的情況下的時間複雜度,就是前面說的需要尋找的x不在陣列中的情況,時間複雜度就是o(n)
但是問題又來了,不管是最好還是最壞,它們發生的概率都是非常小的,都不能真正代表它的時間複雜度,這裡我們就需要再引入乙個概念:平均時間複雜度
還是前面的例子,我們把x在每乙個位置上所需要便利的個數都加起來然後再處以總次數n 1來求平均,這樣的話我們就能夠得到平均時間複雜度了
這裡提供乙個化簡的思路,使用高中所學的倒序相加法來進行化簡,在化簡得到這個值以後,因為在大o表示法中是可以省略係數、低階和常量的,所以最後得到的平均時間複雜度為o(n)
雖然這樣得到的結論是沒有任何問題的,但是在計算的過程中還是有一些出入的,因為這n 1種情況出現的概率是不一樣的,所以在每乙個數計算的時候還需要乘上相對應的概率才可以,具體的運算情況如下
我們知道,要查詢的變數 x,要麼在陣列裡,要麼就不在陣列裡。這兩種情況對應的概率統計起來很麻煩,為了方便你理解,我們假設在陣列中與不在陣列中的概率都為 1/2。另外,要查詢的資料出現在 0~n-1 這 n 個位置的概率也是一樣的,為 1/n。到這裡基本我們常用的時間複雜度就說完了,但是還有一種特殊的平均時間複雜度,那就是均攤時間複雜度所以,根據概率乘法法則,要查詢的資料出現在 0~n-1 中任意位置的概率就是 1/(2n)。因此,前面的推導過程中存在的最大問題就是,沒有將各種情況發生的概率考慮進去。
如果我們把每種情況發生的概率也考慮進去,那平均時間複雜度的計算過程就變成了這樣:
這個值就是概率論中的加權平均值,也叫作期望值,所以平均時間複雜度的全稱應該叫加權平均時間複雜度或者期望時間複雜度。
引入概率之後,前面那段**的加權平均值為 (3n 1)/4。用大 o 表示法來表示,去掉係數和常量,這段**的加權平均時間複雜度仍然是 o(n)。
均攤時間複雜度就是把耗時多的平均到耗時少的上面,一般都是不會遇到的,而且,在能夠應用均攤時間複雜度分析的場合,一般均攤時間複雜度就等於最好情況時間複雜度,所以就不再過多的提它了,因為連平均時間複雜度的應用條件都是極其苛刻的,均攤時間複雜度就更是極少會碰到了,明白最好時間複雜度和最壞時間複雜度就可以了。
掃碼關注即可
部落格:記錄紅隊相關學習筆記
複雜度分析 時間複雜度 空間複雜度
執行效率是演算法的乙個重要的考量指標,演算法的執行效率用時間 空間複雜度來衡量。今天我們來學習一下複雜度的分析。通常我們可以通過執行程式來獲得演算法的真正的執行時間,這種方法我們可以稱為事後統計法,但這種方法得到的是具體的資料,測試結果很依賴測試環境,而且受資料規模影像最大。因此,我們需要乙個不需要...
複雜度分析 時間複雜度分析和空間複雜度分析
其實,只要講到資料結構與演算法,就一定離不開時間 空間複雜度分析。而且我個人認為,複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。1.時間複雜度分析 對於剛才羅列的複雜度量級,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個 o ...
複雜度分析(上)時間複雜度 空間複雜度
為了肉眼 實時 快速地來分析出 的複雜度,我們需要乙個不用具體的測試資料來測試,就可以粗略地估計演算法的執行效率的方法。時間複雜度 空間複雜度 表示演算法的執行時間與資料規模之間的增長關係。每行 對應的 cpu 執行的個數 執行的時間都不一樣,但是,我們這裡只是粗略估計,所以可以假設每行 執行的時間...