這篇從要從四個方面去分析複雜度:最好情況時間複雜度、最壞情況時間複雜度、平均情況時間複雜度、均攤時間複雜度。
首先分析以下例子:
由於在迴圈中有乙個 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 ...