複雜度分析(下)

1.複雜分析度算法

複雜分析度又分爲數組

最好狀況時間複雜度(best case time complexity):在最理想的狀況下,執行一段代碼的時間複雜度.數據結構

最壞狀況時間複雜度(worst case time complexity):在最糟糕的狀況下,執行一段代碼的時間複雜度.學習

平均狀況時間複雜度(average case time complexity)每種狀況下執行的次數與機率的積的累和.it

均攤時間複雜度(amortized time complexity):均攤時間複雜度就是一種特殊的平均時間複雜度。for循環

 

2.最好狀況時間複雜度和最壞狀況時間複雜度數據結構與算法

  // n 表示數組 array 的長度
1  int find(int[] array, int n, int x) {
2  int i = 0;
3  int pos = -1;
4  for (; i < n; ++i) {
5  if (array[i] == x) {
6  pos = i;
7  break;
8  }
9  }
10 return pos;
11 }循環

首先看到for循環,肯定4~7行這段代碼來肯定時間複雜度.可是這又分爲兩種狀況.查找的x存在數組中.查找的x不存在數組中.im

當x存在數組中是這段代碼的時間複雜度是O(1),當x不存在數組中時須要循環整個數組.時間複雜度就是O(n).因此這就須要數據

最好狀況時間複雜度(best case time complexity)、最壞狀況時間複雜度(worst case time complexity)平均狀況時間複雜

度(average case time complexity)來表示一段代碼的複雜度.

 

3.平均狀況時間複雜度

上面這段代碼的的最好狀況時間複雜度,和最壞時間複雜分析度都是在極端狀況下出現的複雜分析度.發生的機率並不大.

既然有了最好和最壞,那就會有平均狀況時間複雜度.那麼上面這段代碼的平均狀況時間複雜分析度爲1+2+3..+n/n+1=n(n+3)/2n+1.

(每種狀況下要循環查找出想x所在數組的個數除以總次數,獲得的就是平均一次查找出x的循環的次數).又由於在大O標記法中.能夠

省掉係數,低階,常量.所平均狀況時間複雜分析度爲O(n).

可是這種狀況並無把x是否存在數組中的機率,以及x處於數組中時x的位置的機率.因此把概論算上.正確的平均狀況時間複雜度

1x1/2x1/n +2x1/2x1/n....+nx1/2xn/1 =3n+1/4,去掉係數,低階常量等.最終平均時間複雜分析度仍是O(n).

這個值就是機率論中的加權平均值,也叫做指望值,因此平均時間複雜度的全稱應該叫加權平均時間複雜度或者指望時間複雜度。

 

4均攤時間複雜度

  // array 表示一個長度爲 n 的數組
  // 代碼中的 array.length 就等於 n
  int[] array = new int[n];
  int count = 0;

  void insert(int val) {
  if (count == array.length) {
  int sum = 0;
  for (int i = 0; i < array.length; ++i) {
  sum = sum + array[i];
  }
  array[0] = sum;
  count = 1;
  }

  array[count] = val;
  ++count;
  }

這段代碼的最好和最壞分別是O(1)和O(n).平均時間複雜分析度爲每次插入的次數乘以機率並相加.即1x1/n+1...+n/n+1=

1+2+3..+n/n+1= (1+n)n/2  x   1/n+1  =n(1+n)/2(n+1)   .因此平均時間複雜分析度爲O(n).

這段代碼在通常狀況下的時間複雜度都爲O(1).只有當count==array.length是時間複雜度才爲O(n).而且在執行此次時間復

雜度爲O(n)以後(數組第一位爲累加的和,其餘數據清空)的n-1次的時間複雜度都爲O(1).其實就是說我每執行n次這段代碼

前n-1次的時間複雜度都爲O(1).最後一次的時間複雜度爲O(n).那平均一下 O(n)/n 不就是O(1)嗎?這就是均攤時間複雜度(攤還分析法)

 

運用的場景:

對一個數據結構進行一組連續操做中,大部分狀況下時間複雜度都很低,只有個別狀況下時間複雜度比較高,並且這些操做之間存在

先後連貫的時序關係,這個時候,咱們就能夠將這一組操做放在一起分析,看是否能將較高時間複雜度那次操做的耗時,平攤到其

他那些時間複雜度比較低的操做上。並且,在可以應用均攤時間複雜度分析的場合,通常均攤時間複雜度就等於最好狀況時間複雜度。

 

 

 

本文是在學習王爭老師的數據結構與算法之美的筆記.有些是王爭老師或者評論的言語.在此附上原文連接

 https://time.geekbang.org/column/article/40447

相關文章
相關標籤/搜索