數據結構和算法:複雜度分析(下)

本篇旨在淺析最好、最壞、平均、均攤時間複雜度。這些時間複雜度能夠表示代碼在不一樣狀況下的不一樣時間複雜度。算法

1、最好和最壞狀況時間複雜度

顧名思義,最好狀況時間複雜度就是,在最理想的狀況下,執行這段代碼的時間複雜度。數組

同理,最壞狀況時間複雜度就是,在最糟糕的狀況下,執行這段代碼的時間複雜度。數據結構

2、平均狀況時間複雜度

通常來講,最好狀況時間複雜度和最壞狀況時間複雜度對應的都是極端狀況下的代碼複雜度,發生的機率其實並不大,爲更好地表示平均狀況下的時間複雜度,須要用另一個概念:平均狀況事件複雜度數據結構和算法

下面舉例分析平均時間複雜度:post

要查找變量x在數組中的位置,有n+1種狀況,在數組的0-n-1位置中和不在數組中。將每一種狀況下,查找須要遍歷的元素個數累計起來,而後再除以n+1,就能夠獲得須要遍歷的元素個數的平均值,即:事件

(1 + 2 + 3 + ... + n + n)/(n+1)=n(n + 3) / (2(n + 1))get

省略掉係數、低階、常量以後,上述公式表示的時間複雜度就是O(n)。效率

上述結論雖然正確,可是計算過程還有問題。在上述的n+1中遍歷狀況,出現的機率並非同樣的,全部須要考慮到機率來進行計算。變量

要查找的變量x,要麼在數組中,要麼不在數組中。這兩種狀況對應的機率計算起來很麻煩,咱們這裏假設x在數組中和不在數組中的機率都是1/2,另外要查找的數據出如今0~n-1這n個位置的機率也是同樣的,爲1/n。根據機率乘法原則,要查找的數據出如今0~n-1中任意位置的機率爲1/(2n),所以平均複雜度的計算公式就變成了:遍歷

(1 + 2 + 3 + ... + n)/ (2n)+n / 2= (3n+1)/4

這個值就是機率論中的加權值,也叫指望值。因此平均時間複雜度的全稱應該是加權平均時間複雜度或者指望時間複雜度


3、均攤時間複雜度

均攤時間複雜度就是一種特殊的平均時間複雜度,對應的分析方法叫作攤還分析法或者均攤分析法

使用攤還分析法須要有很特別的前提:

1 極端狀況出現的頻率很是有規律,並且有必定的先後時序關係

2 其餘大部分狀況下的時間複雜度都相同

在這兩個前提之下,咱們能夠選擇將極端狀況耗費的時間平攤到其餘大部分狀況下。

應用場景:

對一個數據結構進行一組連續操做中,大部分狀況下的時間複雜度都很低,只有個別狀況下的時間複雜度較高,並且這些操做之間存在先後連貫的時序關係,這個時候,咱們能夠將這一組操做放在一起分析,看是否能將較高時間複雜度那次操做的耗時,平攤到其餘那些時間較低的操做上。並且,可以應用均攤時間複雜度分析的場合,通常均攤時間複雜度就等於最好狀況時間複雜度。

4、小結:

本篇講了幾個關於時間複雜度分析相關的概念,包括最好狀況時間複雜度、最壞狀況時間複雜度、平均狀況時間複雜度、均攤時間複雜度。之因此引入這些概念,是由於,同一段代碼,在不一樣輸入的狀況下,複雜度量級有多是不同的。在有了這些概念以後,能夠全面地表示一段代碼的執行效率。



下一篇:數據結構和算法:數組

相關文章
相關標籤/搜索