You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python字典与count函数实现代码的时间复杂度分析求助

时间复杂度分析与代码优化

先拆解你的代码,一步步分析时间复杂度,同时纠正你计算中的几个关键点:

关键错误点纠正

  1. 字典的in操作时间复杂度:Python字典的成员判断(letter not in dict1)是哈希表查找,平均时间复杂度为O(1),而非你认为的O(d)(d为字典大小)。只有在极端哈希冲突的最坏情况下才会退化为O(d),常规分析默认取平均情况。
  2. 第一个循环的重复计算问题:你遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:15:39