Python字典与count函数实现代码的时间复杂度分析求助
时间复杂度分析与代码优化
先拆解你的代码,一步步分析时间复杂度,同时纠正你计算中的几个关键点:
关键错误点纠正
- 字典的
in操作时间复杂度:Python字典的成员判断(letter not in dict1)是哈希表查找,平均时间复杂度为O(1),而非你认为的O(d)(d为字典大小)。只有在极端哈希冲突的最坏情况下才会退化为O(d),常规分析默认取平均情况。 - 第一个循环的重复计算问题:你遍历
magazine的每个字符,但magazine.count(letter)只会在字符第一次出现时执行——后续再遇到相同字符,会直接跳过if分支。因此这部分的计算不是每个迭代都执行O(m),而是仅对每个不同字符执行一次。
原代码时间复杂度详细分析
第一部分:构建字典dict1
for letter in magazine: # 遍历magazine,共O(m)次迭代 if letter not in dict1: # 平均O(1) dict1[letter] = magazine.count(letter) # 遍历整个magazine统计字符,O(m)
- 遍历
magazine本身是O(m)。 - 假设
magazine中有d个不同字符,那么magazine.count(letter)会执行d次,每次O(m),这部分总耗时O(d*m)。 - 因此第一部分总时间复杂度为:O(m + dm) = O(md)。如果题目限定字符集为固定大小(比如小写英文字母,d=26),d是常数,这部分可简化为O(m)。
第二部分:校验ransomNote
for letter in ransomNote: # 遍历ransomNote,共O(n)次迭代 if letter not in dict1 or dict1[letter] < ransomNote.count(letter): # 平均O(1) + O(n) return "False"
- 遍历
ransomNote是O(n)。 - 每次迭代中,
ransomNote.count(letter)会遍历整个ransomNote统计字符,耗时O(n);字典判断是O(1)。 - 这里的问题是:即便
ransomNote中有重复字符,每次遇到都会重复执行count,比如ransomNote是"aaa",会执行3次O(n)的统计。 - 因此第二部分总时间复杂度为:O(n*n) = O(n²)。
原代码总时间复杂度
综合两部分,总时间复杂度为 O(m*d + n²)。若字符集为固定常数大小,则简化为O(m + n²)。
优化方案:降低时间复杂度至O(m + n)
你的代码存在重复统计字符的问题,用Python内置的collections.Counter可以高效统计字符频率,避免重复遍历:
from collections import Counter class Solution: def canConstruct(self, ransomNote: str, magazine: str) -> bool: mag_count = Counter(magazine) # 构建magazine的字符频率表,O(m) ransom_count = Counter(ransomNote) # 构建ransomNote的字符频率表,O(n) for char, cnt in ransom_count.items(): if mag_count.get(char, 0) < cnt: return False return True
Counter的构造过程是线性时间,分别为O(m)和O(n)。- 遍历
ransom_count的不同字符,最多O(n)次迭代,每次字典查找是O(1)。 - 总时间复杂度为O(m + n),是最优的时间复杂度。
内容的提问来源于stack exchange,提问作者Ayushi Pandey
相关产品推荐
相关产品推荐

