問題:
有一個字符串數組,將數組中的每一個字符串按照字母序排序;之後再將整個字符串數組按照字典序排序。整個操作的時間複雜度是多少?
分析:
- 假設最長的字符串長度爲 s (爲什麼要假設最長字符串呢?因爲通常求的時間複雜度是上界,所以我們假象這個字符串數組中所有字符串的長度都是最長的 s ,這樣計算得出來的時間複雜度就是上界,包含了最壞的情況);數組中有 n 個字符串
- 我們將計算分爲兩部分:一部分是計算每個字符串按照字母序排序的時間複雜度;另一部分是計算將整個字符串數組按照字母序排序的時間複雜度。
- 因爲對每個單獨的字符串排序:O(slogs),所以將數組中的每一個字符串都按照字母序排序:O(n * slog(s))
- 將整個字符串數組按照字典序排序:O(s * nlog(n))
注意這裏比較的是字符串,所以在按照字典序排序的時候還需要消耗每個字符串的長度 - 將這兩部分的計算結果合併:O(n * slog(s)) + O(s * nlog(n)) = O(n * s * logs + s * b * logn)
總結
通常,一個算法如果由兩部分組成,那麼整個算法的時間複雜度應取複雜度最大的那個。
e.g. O(nlogn + n) = O(nlogn)
這麼計算的前提是這兩部分處理的規模 n 是一樣的,如果對於 O(AlogA + B) 這種情況,因爲 A 和 B 沒有關係,我們就沒有辦法確認 A 和 B 誰的規模大,所以不能確認以哪個爲主。
比較常見的一個例子就是對鄰接表實現圖的遍歷的情況,其時間複雜度爲 O(V + E),V 和 E 沒有必然聯繫,所以彼此不能替換。除非是一個完全圖 or 稠密圖,此時 E 近乎是 V^2 級別,此時時間複雜度就是 O(V^2) ,這也是用鄰接矩陣實現圖的遍歷時的複雜度,但是通常用鄰接表處理的都是一些稀疏圖。總之,就是 V 和 E 是兩個不同的規模,不能混爲一談,在考慮時間複雜度時需要考慮類似這樣的情況。