時間複雜度分析

在上一篇文章中咱們提到了時間複雜度大O分析法的使用,此次繼續來探究時間複雜度的分析數組

咱們先來看一下下面這段代碼學習

這段代碼的做用是在數組中尋找x的位置,找到了直接返回位置,沒有找到的話返回-1,用上一篇文章所學到的知識,能夠很清楚的看出來,這段代碼的時間複雜度爲O(n)優化

可是這段代碼明顯還有優化的空間,若是咱們在數組中間尋找到x的話,就不須要把整個數組都循環一邊了,因此能夠優化爲下面這段代碼。blog

若是在這種狀況下的話,就不能用上一次所說到的方法來衡量了,由於咱們不知道須要尋找的x所在的位置在哪裏,若是在第一個的話,它的時間複雜度就是O(1),若是這個數組裏沒有的話,就須要所有遍歷一遍,它的時間複雜度就是O(n),這裏就須要引入最好時間複雜度最壞時間複雜度get

顧名思義,最好時間複雜度就是在最理想的狀態下的時間複雜度,就是咱們前面說的,所須要找的x剛好是數組的第一個字符,時間複雜度爲O(1)博客

最壞時間複雜度就是在最糟糕的狀況下的時間複雜度,就是前面說的須要尋找的x不在數組中的狀況,時間複雜度就是O(n)變量

可是問題又來了,不論是最好仍是最壞,它們發生的機率都是很是小的,都不能真正表明它的時間複雜度,這裏咱們就須要再引入一個概念:平均時間複雜度cli

仍是前面的例子,咱們把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)。

到這裏基本咱們經常使用的時間複雜度就說完了,可是還有一種特殊的平均時間複雜度,那就是均攤時間複雜度

均攤時間複雜度就是把耗時多的平均到耗時少的上面,通常都是不會遇到的,並且,在可以應用均攤時間複雜度分析的場合,通常均攤時間複雜度就等於最好狀況時間複雜度,因此就再也不過多的提它了,由於連平均時間複雜度的應用條件都是極其苛刻的,均攤時間複雜度就更是極少會碰到了,明白最好時間複雜度和最壞時間複雜度就能夠了。

文章首發公衆號和我的博客:

公衆號:無意的夢囈(wuxinmengyi)

這是一個記錄紅隊學習、信安筆記,我的成長的公衆號

掃碼關注便可

博客:http://blog.seclibs.com/

記錄紅隊相關學習筆記

相關文章
相關標籤/搜索