一個時間複雜度問題

問題:

有一個字符串數組,將數組中的每一個字符串按照字母序排序;之後再將整個字符串數組按照字典序排序。整個操作的時間複雜度是多少?

分析:

  1. 假設最長的字符串長度爲 s (爲什麼要假設最長字符串呢?因爲通常求的時間複雜度是上界,所以我們假象這個字符串數組中所有字符串的長度都是最長的 s ,這樣計算得出來的時間複雜度就是上界,包含了最壞的情況);數組中有 n 個字符串
  2. 我們將計算分爲兩部分:一部分是計算每個字符串按照字母序排序的時間複雜度;另一部分是計算將整個字符串數組按照字母序排序的時間複雜度
  3. 因爲對每個單獨的字符串排序:O(slogs),所以將數組中的每一個字符串都按照字母序排序:O(n * slog(s))
  4. 將整個字符串數組按照字典序排序:O(s * nlog(n))
    注意這裏比較的是字符串,所以在按照字典序排序的時候還需要消耗每個字符串的長度
  5. 將這兩部分的計算結果合併: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 是兩個不同的規模,不能混爲一談,在考慮時間複雜度時需要考慮類似這樣的情況。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章