|
【作者簡(jiǎn)介】 程序員小吳,一個(gè)致力于用動(dòng)畫圖解數(shù)據(jù)結(jié)構(gòu)的程序員。LeetCodeAnimation作者,GitHub一萬,連續(xù)一月占據(jù)Trending榜榜首。 上篇文章講述了與復(fù)雜度有關(guān)的大 O 表示法和常見的時(shí)間復(fù)雜度量級(jí),這篇文章來講講另外幾種復(fù)雜度: 遞歸算法的時(shí)間復(fù)雜度(recursive algorithm time complexity),最好情況時(shí)間復(fù)雜度(best case time complexity)、最壞情況時(shí)間復(fù)雜度(worst case time complexity)、平均時(shí)間復(fù)雜度(average case time complexity)和均攤時(shí)間復(fù)雜度(amortized time complexity)。 遞歸算法的時(shí)間復(fù)雜度如果遞歸函數(shù)中,只進(jìn)行一次遞歸調(diào)用,遞歸深度為depth; 在每個(gè)遞歸的函數(shù)中,時(shí)間復(fù)雜度為T; 則總體的時(shí)間復(fù)雜度為O(T * depth)。 在前面的學(xué)習(xí)中,歸并排序 與 快速排序 都帶有遞歸的思想,并且時(shí)間復(fù)雜度都是O(nlogn) ,但并不是有遞歸的函數(shù)就一定是 O(nlogn) 級(jí)別的。從以下兩種情況進(jìn)行分析。 ① 遞歸中進(jìn)行一次遞歸調(diào)用的復(fù)雜度分析二分查找法 1int binarySearch(int arr[], int l, int r, int target){比如在這段二分查找法的代碼中,每次在 [ l , r ] 范圍中去查找目標(biāo)的位置,如果中間的元素 在這個(gè)遞歸函數(shù)中,每一次沒有找到 求和在這段代碼中比較容易理解遞歸深度隨輸入 n 的增加而線性遞增,因此時(shí)間復(fù)雜度為 O (n)。 求冪1//遞歸深度:logn遞歸深度為 ② 遞歸中進(jìn)行多次遞歸調(diào)用的復(fù)雜度分析遞歸算法中比較難計(jì)算的是多次遞歸調(diào)用。 先看下面這段代碼,有兩次遞歸調(diào)用。 遞歸樹中節(jié)點(diǎn)數(shù)就是代碼計(jì)算的調(diào)用次數(shù)。 比如 當(dāng)
一般的,調(diào)用次數(shù)計(jì)算公式為
與之有所類似的是 歸并排序 的遞歸樹,區(qū)別點(diǎn)在于
因此,在如 歸并排序 等排序算法中,每一層處理的數(shù)據(jù)量為 O(n) 級(jí)別,同時(shí)有 最好、最壞情況時(shí)間復(fù)雜度最好、最壞情況時(shí)間復(fù)雜度指的是特殊情況下的時(shí)間復(fù)雜度。 動(dòng)圖表明的是在數(shù)組 array 中尋找變量 x 第一次出現(xiàn)的位置,若沒有找到,則返回 -1;否則返回位置下標(biāo)。 1int find(int[] array, int n, int x) {在這里當(dāng)數(shù)組中第一個(gè)元素就是要找的 x 時(shí),時(shí)間復(fù)雜度是 O(1);而當(dāng)最后一個(gè)元素才是 x 時(shí),時(shí)間復(fù)雜度則是 O(n)。 最好情況時(shí)間復(fù)雜度就是在最理想情況下執(zhí)行代碼的時(shí)間復(fù)雜度,它的時(shí)間是最短的;最壞情況時(shí)間復(fù)雜度就是在最糟糕情況下執(zhí)行代碼的時(shí)間復(fù)雜度,它的時(shí)間是最長(zhǎng)的。 平均情況時(shí)間復(fù)雜度最好、最壞時(shí)間復(fù)雜度反應(yīng)的是極端條件下的復(fù)雜度,發(fā)生的概率不大,不能代表平均水平。那么為了更好的表示平均情況下的算法復(fù)雜度,就需要引入平均時(shí)間復(fù)雜度。 平均情況時(shí)間復(fù)雜度可用代碼在所有可能情況下執(zhí)行次數(shù)的加權(quán)平均值表示。 還是以
均攤復(fù)雜度分析我們通過一個(gè)動(dòng)態(tài)數(shù)組的
例如,數(shù)組長(zhǎng)度為 n,則前 n 次調(diào)用 因此,平均來看:對(duì)于容量為 n 的動(dòng)態(tài)數(shù)組,前面添加元素需要消耗了 1 * n 的時(shí)間,擴(kuò)容操作消耗 n 時(shí)間 ,總共就是 2 * n 的時(shí)間,因此均攤時(shí)間復(fù)雜度為 O(2n / n) = O(2),也就是 O(1) 級(jí)別了。 可以得出一個(gè)比較有意思的結(jié)論:一個(gè)相對(duì)比較耗時(shí)的操作,如果能保證它不會(huì)每次都被觸發(fā),那么這個(gè)相對(duì)比較耗時(shí)的操作,它所相應(yīng)的時(shí)間是可以分?jǐn)偟狡渌牟僮髦衼淼摹?/p> |
|
|