演算法與資料結構(三) 時間複雜度分析 例題

2021-10-22 15:10:11 字數 1310 閱讀 6381

用幾種分析方法分析下面函式的時間複雜度

// 全域性變數,大小為10的陣列array,長度len,下標i。

int array=

newint[10

];int len =10;

int i =0;

void

add(

int element)

array = new_array;

len =

2* len;

}// 將element放到下標為i的位置,下標i加一

array[i]

= element;

++i;

}

首先,簡單分析一下這個函式,很明顯這是乙個往陣列中插入元素的函式方法。當陣列元素不夠時,重新開闢乙個2倍於原陣列大小的陣列空間,把原來array陣列中的資料迴圈遍歷到new_array陣列中,再把new_array複製給array,最後將待插入的element放到下標為i的位置,下標i加一,完成操作。

下面來分析它的時間複雜度:

最好情況分析

當i < len時,即 i = 0,1,2,…,n-1的時候,不需要走for迴圈操作,即可以直接插入元素,因此最好情況時間複雜度為 o(1)。

最壞情況分析:

當i >= len時, 即 i = n的時候,需要走for迴圈操作,因此最壞時間複雜度為 o(n

nn)。

平均情況分析

當每次遇到最壞情況時陣列會進行2倍擴容,原陣列被匯入新陣列,雖然陣列的長度變大了,但是插入操作落在區間的長度是一樣的,分別是0到n-1,n到2n-1…插入的情況仍是n+1種:0到n-1都是o(1)和插滿之後的o(n

nn);

所以每次插入的概率p=1

/(n+

1)

p= 1/(n+1)

p=1/(n

+1),最後求出加權平均時間複雜度為1∗p

+1∗p

+...

+1∗p

+n∗p

=2n/

(n+1

)=o(

1)

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

1∗p+1∗

p+..

.+1∗

p+n∗

p=2n

/(n+

1)=o

(1);

攤還分析

可以發現,每出現一次最壞情況的o(n

nn),就會出現n-1次o(1),可以把每一次o(n

nn)時間複雜度,用後面的 n-1 次 o(1) 均攤,可以得到均攤時間複雜度o(1)。

資料結構與演算法2 時間複雜度和空間複雜度

演算法效率的度量方法 事後統計的方法 事前分析估算方法。演算法的時間複雜度 在進行演算法分析時,語句總的執行次數t n 是關於問題規模n的函式,進而分析t n 隨n的變化情況並確定t n 的數量級。演算法的時間複雜度記作 t n o f n 它表示隨問題規模n的增大,演算法執行時間的增長率和f n ...

資料結構與演算法 二 時間複雜度和空間複雜度

演算法採用的策略 方案 編譯產生的 質量 問題的輸入規模 機器執行指令的速度 由此可見,拋開計算機硬體,乙個程式的執行時間依賴於演算法的好壞和輸入規模。int i,sum 0,n 100 for i 1 i n i printf d sum int i,sum 0,n 100 sum i n n 2...

資料結構與演算法(二) 時間複雜度和空間複雜度

演算法採用的策略,方案 編譯產生的 質量 問題的輸入規模 機器執行指令的速度 由此可見,拋開這些與計算機硬體 軟體有關的因素,乙個程式的執行時間依賴於演算法的好壞和問題的輸入規模 我們研究演算法的複雜度,側重的是研究演算法隨著輸入規模擴大增長量的乙個抽象,而不是精確的定位需要執行多少次 我們不關心語...