演算法複雜度分析 下

2021-09-29 00:18:26 字數 1394 閱讀 5371

在乙個陣列中查詢目標值x的**我們可以像下面這樣寫:

int

find

(int

array,

int x)

}return pos;

}

目標值x可能出現在陣列中的不同位置,也可能沒在陣列**現過:

所以,不同情況下,這段**的時間複雜度是不一樣的。為了表示**在不同情況下的不同時間複雜度,我們需要引入三個概念:最好時間複雜度、最壞時間複雜度和平均情況複雜度。

顧名思義,最好情況複雜度就是在最理想的情況下,執行這段**的時間複雜度。就像剛剛我們查詢陣列中元素x,x正好是陣列的第乙個元素,這個時候對應的時間複雜度就是最好的情況時間複雜度。

同理,最壞情況時間複雜度就是在糟糕的情況下,執行這段**的時間複雜度。就像剛剛那個目標值不在陣列中的情況,我們需要遍歷整個陣列,這個時候對應的時間複雜度就是最壞的情況時間複雜度。

最好情況時間複雜度和最壞情況時間複雜度對應的都是極端情況下的**複雜度,發生的概率並不大。為了更好地表示平均情況下的複雜度,我們引入另乙個概念:平均情況時間複雜度。

在上面那段**中,要查詢的目標值x在陣列中的情況有n+1中情況:在陣列的0~n-1位置不在陣列中。我們把每種情況下,需要遍歷的元素個數累加起來,然後再除以n+1,就可以得到需要遍歷的元素個數的平均值:

(1+2+3+···+n+n)/(n+1)=n(n+3)/2(n+1)
在大o標記法中,可以忽略掉係數、低階、常量,所以這個公式簡化後之後,得到的平均時間複雜度就是o(n)。

這個結論雖然是正確的,但是其實計算過程稍微有點問題。這裡的n+1中情況出現的概率並不是一樣的。對於目標值x,要麼在陣列裡,要麼不在陣列裡,為了方便理解,可以假設在陣列中和不在陣列中的概率都為1/2.另外,要查詢的資料出現在0~~n-1中任意位置的概率也是一樣的,為1/n。所以,根據概率論知識,要查詢的資料出現在0~n-1中任意位置的概率就是1/(2n)。

現在,平均時間複雜度的過程為:

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

這個值就是概率論中的加權平均值,也叫作期望值,所以平均時間複雜度的全稱應該叫作加權平均時間複雜度或者期望時間複雜度

資料結構與演算法之美

演算法複雜度分析(下)

目錄 一 最好 最壞情況時間複雜度 二 平均情況時間複雜度 三 均攤時間複雜度 通過 演算法複雜度分析 上 我們掌握了大部分的演算法分析方法,本文將繼續講解四個複雜度分析方面的知識點 最好情況時間複雜度 最壞情況時間複雜度 平均情況時間複雜度 均攤時間複雜度。我們來分析下面這段 的時間複雜度 fun...

複雜度分析(下)

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

演算法複雜度分析

分析非遞迴演算法效率的通用方案 1.決定用哪個 哪些 引數作為輸入規模的度量 2.找出演算法的基本操作 作為一規律,它總是位於演算法的最內層迴圈中 3.檢查基本操作的執行次數是否只依賴輸入規模。如果它還依賴一些其他的特性,則最差效率 平均效率以及最優效率 如果必要 需要分別研究。4.建立乙個演算法基...