1. 程式人生 > 實用技巧 >2020.10.14 演算法複雜度分析

2020.10.14 演算法複雜度分析

演算法複雜度分析若干例項

記錄leetcode每日一題演算法複雜度分析過程:

2020.10.14

查詢常用字元

題目連結 == >https://leetcode-cn.com/problems/find-common-characters/

class Solution:
    def commonChars(self, A: List[str]) -> List[str]:
        minfreq = [float("inf")] * 26
        for word in A:
            freq = [0] * 26
            for ch in word:
                freq[ord(ch) - ord("a")] += 1
            for i in range(26):
                minfreq[i] = min(minfreq[i], freq[i])
        
        ans = list()
        for i in range(26):
            ans.extend([chr(i + ord("a"))] * minfreq[i])
        return ans

作者:LeetCode-Solution
連結:https://leetcode-cn.com/problems/find-common-characters/solution/cha-zhao-chang-yong-zi-fu-by-leetcode-solution/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

複雜度分析

  • 時間複雜度:\(O(n(m+|\Sigma|))\),其中 \(n\)是陣列 \(A\) 的長度(即字串的數目),\(m\)是字串的平均長度,\(\Sigma\)為字符集,在本題中字符集為所有小寫字母,\(|\Sigma|=26\)

    • 遍歷所有字串並計算\(freq\)的時間複雜度為\(O(nm)\)
    • 使用\(freq\)更新\(minfreq\)的時間複雜度為\(O(n|\Sigma|)\)
    • 由於最終答案包括的字符合數不會超過最短的字串長度,因此構造最終答案的時間複雜度為\(O(m+|\Sigma|)\)。這一項在漸進意義上小於前兩者可以忽略。個人理解本項計算分為兩部分,遍歷的部分操作時間複雜度為\(O(|\Sigma|*1)\)
      ,擴充答案列表的操作時間複雜度\(O(minLength(A的字元)*1) <=O(m*1)\)
  • 空間複雜度:\(O(|\Sigma|)\),這裡只計算儲存答案之外的空間我們使用陣列\(freq\)\(minfreq\),他們的長度均為\(|\Sigma|\)