筆記 複雜度分析(下)

2021-09-11 10:59:15 字數 1261 閱讀 7940

前言

四個複雜度分析

1.最壞情況時間複雜度:**在最壞情況下執行的時間複雜度。 2.最好情況時間複雜度:**在最理想情況下執行的時間複雜度。 3.平均時間複雜度(加權平均時間複雜度):**在所有情況下執行次數的加權平均值表示的時間複雜度。 4.均攤時間複雜度:在**執行的所有複雜度情況中絕大部分是低階別的複雜度,個別情況是高階別複雜度且發生具體時序關係時,可以將個別高階別複雜度均攤到低階複雜上。基本上均攤結果就等於低階複雜度。

為什麼引入這些概念

先舉乙個查詢元素的例子:

void method(int  array, int s) 

} return count;

}複製**

可以看出,有可能執行1次就找到了,有可能需要執行n次就找到了,還有可能執行了 n+1 次沒有找到。這個時候就需要上面的四個複雜度進行分析了。

**複雜度在不同情況下出現量級差別時,才需要區別這四種情況,大多數情況下,是不需要區別分析它們的。

可以得出,最好情況時間複雜度為o(1),最壞情況時間複雜度為o(n)。那麼平均複雜度和均攤複雜度又是什麼呢?

如何進行平均、均攤複雜度分析

1.平均時間複雜度 **在不同情況下的平均時間複雜度,用**所有可能情況下執行次數的加權值表示。 在上述例子中,假如,出現在陣列中和不出現在陣列中的概率是對等的,每個都是1/2,0~n-1的概率也是相等的,就是1/n,那麼每種情況就是 1/2n,那麼就有了下面的公式:

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

複製**

用大o表示法,就是o(n)

均攤時間複雜度 這種情況比平均時間複雜度的場景更加的特殊,可以將均攤時間複雜度理解為一種特殊的平均時間複雜度。就是將高階的複雜度均攤到低階的複雜度上。

int  array = new int [n]

void insert (int x, int s)

array1[x] = s;

return array1;

} else

}複製**

分為兩種 一種是 n >= x,執行一次,複雜度為o(1)。另一種 n < x,執行n次,複雜度為o(n).假如這 n+1次發生的概率一樣,都是 1/n+1,

(1 * 1/n+1) + (1 * 1/n+1) + ... +(n * 1/n+1) = o(1) 

複製**

所以均攤複雜度為 o(1)

複雜度分析(下)

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

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

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

二 複雜度分析 下

這篇從要從四個方面去分析複雜度 最好情況時間複雜度 最壞情況時間複雜度 平均情況時間複雜度 均攤時間複雜度。首先分析以下例子 由於在迴圈中有乙個 if 判斷語句,所以無法粗略的定義該段 的時間複雜度為o n 在這裡我們就需要引入三個概念 最好情況時間複雜度 最壞情況時間複雜度 平均情況時間複雜度。由...