前言
四個複雜度分析
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 在這裡我們就需要引入三個概念 最好情況時間複雜度 最壞情況時間複雜度 平均情況時間複雜度。由...