全面分析算法複雜度

在很多時候, 由於原始數據的不確定性, 算法的複雜度並不是唯一的, 可能具有多種不同的複雜度, 一個算法完整的時間複雜度分析包括如下:

  • 最好情況時間複雜度(best case time complexity);

  • 最壞情況時間複雜度(worst case time complexity);

  • 平均情況時間複雜度(average case time complexity);

  • 均攤時間複雜度(amortized time complexity);

show a code

// 在一個無序的數組(array)中,查找變量 x 出現的位置。如果沒有找到,就返回 -1。
// n表示數組array的長度
int find(int[] array, int n, int x) {
  int i = 0;
  int pos = -1;
  for (; i < n; ++i) {
    if (array[i] == x) {
       pos = i;
       break;
    }
  }
  return pos;
}
最好情況時間複雜度

數組中第一個元素正好是要查找的變量 x,那就不需要繼續遍歷剩下的 n-1 個數據了,那時間複雜度就是 O(1).

最壞情況時間複雜度

若數組中不存在變量 x,那我們就需要把整個數組都遍歷一遍,時間複雜度就成了 O(n)。

平均情況時間複雜度

最好情況時間複雜度和最壞情況時間複雜度對應的都是極端情況下的代碼複雜度,發生的概率其實並不大。爲了更好地表示平均情況下的複雜度,我們需要引入另一個概念:平均情況時間複雜度,後面我簡稱爲平均時間複雜度.

  • 簡要分析(不考慮概率問題)

有 n+1 種情況:在數組的 0~n-1 位置中和不在數組中。我們把每種情況下,查找需要遍歷的元素個數累加起來,然後再除以 n+1,就可以得到需要遍歷的元素個數的平均值,即:

省略掉係數、低階、常量,所以,咱們把剛剛這個公式簡化之後,得到的平均時間複雜度就是 O(n).

  • 更合理詳細的分析
  1. 假設在數組中與不在數組中的概率都爲 1/2;
  2. 且數據出現在 0~n-1 這 n 個位置的概率也是一樣的, 爲 1/n;

在這裏插入圖片描述

這個值就是概率論中的加權平均值,也叫作期望值,所以平均時間複雜度的全稱應該叫加權平均時間複雜度或者期望時間複雜度。用大 O 表示法來表示,去掉係數和常量,這段代碼的加權平均時間複雜度仍然是 O(n)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章