2020.10.14 演算法複雜度分析
阿新 • • 發佈:2020-10-15
演算法複雜度分析若干例項
記錄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(|\Sigma|)\),這裡只計算儲存答案之外的空間我們使用陣列\(freq\)和\(minfreq\),他們的長度均為\(|\Sigma|\)。