資料結構與演算法 第二章 複雜度分析 續

2021-10-06 17:18:14 字數 2773 閱讀 1049

3.小結

4.參考

本章會討論四個複雜度分析的概念

我們先看一段簡單的**:找到陣列中元素為 x 的下標位置

public

static

intfind

(int

array,

int n,

int x)

}return pos;

}

根據我們上一章的內容可以分析出來這段**的時間複雜度為 o(n),但是我們每次找出對應的元素,並不需要將整個陣列遍歷一遍,**可以進行以下優化

public

static

intfind2

(int

array,

int n,

int x)

}return pos;

}

與之前的不同點在於要查詢的變數 x 可能在 array 陣列的任意位置,導致這段**的時間複雜度和之前的情況有所不同

所以在不同的情況下,**的時間複雜度是不一樣的,因此我們需要引入三個概念來進行分析

上面的例子中,最好情況時間複雜度就是 array 陣列的第乙個元素就是 x,那麼時間複雜度就是 o(1)。

反之最壞的情況就是 array 陣列的第最後乙個元素是 x 或者沒有 x 元素,那麼時間複雜度就是 o(n)。

最好和最壞的情況其實概率很低,所以我們需要引入另乙個概念,平均情況時間複雜度。

前提:假設查詢的元素一定在陣列中(為了理解方便)

在長度為 n 的陣列中,我們查詢每個元素的概率是 1/n。

x 查詢 1 次被找到的概率 = 1*1/n

x 查詢 2 次被找到的概率 = 2*1/n

將所有的概率加在一起就可以得到平均情況時間複雜度計算如下

1 ∗1

/n+2

∗1/n

+3∗1

/n+.

..+n

∗1/n

=(n+

1)/2

1*1/n+2*1/n+3*1/n+...+n*1/n = (n+1)/2

1∗1/n+

2∗1/

n+3∗

1/n+

...+

n∗1/

n=(n

+1)/

2 去掉系列、常量的影響,我們發現平均情況時間複雜度還是為 o(n);和上面的兩種複雜度相比,稍微有點複雜,雖然已經遮蔽了一些因素。

在大部分情況下,我們並不會分析這三種複雜度,只有同一塊**在不同的情況下,時間複雜度有量級的差距,我們才會使用這三種複雜度表示法來區分。

實現功能如下:

static

int count =0;

public

static

void

insert

(int

array,

int val)

array[0]

= sum;

count =1;

} array[count]

= val;

++count;

}

呼叫**

public

static

void

main

(string[

] args)

printlnarray

(array)

;}

執行結果:

10,5,2,3,4
上述**只是為了說明均攤時間複雜度,不需要糾結實現細節。

我們先分析下時間複雜度

假設陣列長度為 n 那麼平均時間複雜度計算公式為

1 ∗1

/n+1

+1∗1

/n+1

+...

+1∗1

/n+1

+n∗1

/n+1

=o(1

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

1∗1/n+

1+1∗

1/n+

1+..

.+1∗

1/n+

1+n∗

1/n+

1=o(

1)insert() 和上面的 find() 最大區別在於,在 find 中大部分情況下時間複雜度為 o(n),極少數情況下才為o(1),而 insert() 正好相反。

在這種特殊的場景下需要引入一種新的分析方法:均攤時間複雜度

在 insert 這個例子中,每次觸發 count == array.length 這個條件時,都會執行 n-1 次的時間複雜度為 o(1) 插入操作,才會執行一次複雜度為 o(n) 插入,如果把耗時最多的這次操作時間均攤到這 n-1 次中,這個連續 n 次的插入操作的時間複雜度還是 o(1),這種時間均攤的統計分析方法就是均攤時間複雜度

本章討論這四個複雜度概念,是因為同一段**,在不同輸入的情況下,複雜度量級有可能是不一樣的。在引入這幾個概念之後,我們可以更加全面地表示一段**的執行效率。

平均情況時間複雜度均攤時間複雜度看起來比較類似,所以有點難以理解和區分,我們不用花太多時間去區分他們,都是在一些比較特殊的場景分析採用用到,一般均攤時間複雜度就等於最好情況時間複雜度。

演算法 第二章 時間複雜度與空間複雜度

時間複雜度定義 進行演算法分析時 這樣用o來體現演算法時間複雜度的方法,叫做大o記法。隨著資料規模n的增大,t n 增長最為緩慢的的演算法叫做最優演算法 那麼如何分析演算法的時間複雜度呢?如何推導大o的階呢?常數階 o 1 cout xiaohan xiaohan xiaohan xiaohan x...

資料結構與演算法 複雜度分析

一 什麼是複雜度分析?1.資料結構和演算法解決是 如何讓計算機更快時間 更省空間的解決問題 2.因此需從執行時間和占用空間兩個維度來評估資料結構和演算法的效能。3.分別用時間複雜度和空間複雜度兩個概念來描述效能問題,二者統稱為複雜度。4.複雜度描述的是演算法執行時間 或占用空間 與資料規模的增長關係...

資料結構與演算法(二) 複雜度分析(下)

除了前面記錄的複雜度的基礎知識,還有四個複雜度分析方面的知識點 最好情況時間複雜度 最壞情況時間複雜度 平均情況時間複雜度 均攤時間複雜度。先看一段 public int find int array,int n,int x return pos 這是在乙個無序的陣列中查詢x的位置,並返回x的下標,...