二 複雜度分析 下

2021-09-05 09:59:15 字數 1535 閱讀 2332

這篇從要從四個方面去分析複雜度:最好情況時間複雜度最壞情況時間複雜度平均情況時間複雜度均攤時間複雜度。

首先分析以下例子:

由於在迴圈中有乙個 if 判斷語句,所以無法粗略的定義該段**的時間複雜度為o(n)。在這裡我們就需要引入三個概念

最好情況時間複雜度、最壞情況時間複雜度、平均情況時間複雜度。

由該例子,我們走兩個極端,所以最好情況時間複雜度為o(1);最壞情況時間複雜度為o(n)。這兩種極端比較好理解,平均情況時間複雜度就需要詳細解釋。

還是根據上例**,進行分析。總共出現n+1種情況:0~n-1 以及 x不在該陣列中的情況,所以公式如下:

上述方法雖然正確,但是沒有考慮概率問題,出現的n+1種情況出現的概率不可能全部相等,我們可以考慮進去一些簡單的概率知識。

假設需要查詢的x在陣列內 和 不在陣列內的概率為1/2,0~n-1這n個數出現的概率為1/n,所以0~n-1出現的概率為1/2n。不在該陣列出現的可能也應該是n次,得到的公式如下:

最後得到的結果也是o(n),該值在概率中叫做加權平均數,也叫做期望值。

平均時間複雜度的全稱也叫做加權平均時間複雜度。

在大多數情況下,不需要區分這三個複雜度,使用乙個複雜度就可以滿足需求了。

該方法是向陣列中插入值,當該陣列被插滿的時候,將陣列中的值進行累加,並把累加和賦給陣列0下標的值。並且下次再插入數值時,從陣列下標1的位置開始向後賦值,再次賦滿的時候求和然後覆蓋掉0下標的值。

我們根據**得出:

最壞情況時間複雜度:o(n)    進入for迴圈求和的時候

最好情況時間複雜度:o(1)    進入該方法只進行了賦值

平均情況時間複雜度:o(1)    有n種情況o(1),只有一種額外的情況是o(n),故可得下式:

由於該情況比較特殊,它在大多數情況下都是o(1),只有在一種情況下是o(n),故我們根據這種情況引入了均攤時間複雜度

因為沒出現一次o(n)求和操作,都會跟著n-1的o(1),所以這一套操作均攤之後,時間複雜度為o(1)。值就是均攤時間複雜度的基本思路。

複雜度分析(下)

最好 最壞時間複雜度分析 n 表示陣列 array 的長度 int find int array,int n,int x return pos 上面 的功能是在乙個陣列中查詢乙個變數x出現的位置,如果沒有找到,返回 1。這段 的時間複雜度應該為o n 其中n為數字的長度。但是我們在陣列中查詢資料,並...

複雜度分析(二)

在前面一篇文章中,我們講了為什麼要進行複雜度分析,以及如何分析複雜度。那麼接下來我將舉乙個例子,請你按照之前的複雜度分析分析出來。for var i 0 i arr.length i 上面這段 的複雜度是多少呢,假設陣列長度為n,最好的情況下是i 0的時候,就找到相等的了,最壞情況下是 最後乙個才找...

複雜度分析 時間複雜度分析和空間複雜度分析

其實,只要講到資料結構與演算法,就一定離不開時間 空間複雜度分析。而且我個人認為,複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。1.時間複雜度分析 對於剛才羅列的複雜度量級,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個 o ...