用幾種分析方法分析下面函式的時間複雜度
// 全域性變數,大小為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...
資料結構與演算法(二) 時間複雜度和空間複雜度
演算法採用的策略,方案 編譯產生的 質量 問題的輸入規模 機器執行指令的速度 由此可見,拋開這些與計算機硬體 軟體有關的因素,乙個程式的執行時間依賴於演算法的好壞和問題的輸入規模 我們研究演算法的複雜度,側重的是研究演算法隨著輸入規模擴大增長量的乙個抽象,而不是精確的定位需要執行多少次 我們不關心語...