如何优化矩阵中最高频元素查找函数的性能?
优化矩阵高频元素统计的性能方案
你的代码核心性能瓶颈在于重复调用flatten_m.count(i):每遇到一个元素就遍历整个扁平化列表统计次数,比如元素0出现4次,就会被重复统计4次,整体时间复杂度达到O(n²)(n为矩阵总元素数),矩阵越大性能越差。
优化方案:用collections.Counter做一次频次统计
Counter是Python标准库中专门用于频次统计的工具,底层基于哈希表实现,只需遍历一次元素就能完成所有统计,时间复杂度降到O(n),同时避免重复计算。
修改后的代码如下:
from itertools import chain from collections import Counter def max_repeat_elem(matrix): # 处理空矩阵或全空行的情况 if not matrix or not any(row for row in matrix): return None # 直接用迭代器传入Counter,无需转成列表节省内存 flatten_iter = chain.from_iterable(matrix) elem_counts = Counter(flatten_iter) # 构建「频次-元素列表」的映射 freq_to_elems = {} for elem, count in elem_counts.items(): if count not in freq_to_elems: freq_to_elems[count] = [] freq_to_elems[count].append(elem) # 取最高频次对应的元素列表 max_freq = max(freq_to_elems.keys()) return freq_to_elems[max_freq]
优化点说明
- 避免重复统计:
Counter一次性遍历所有元素完成统计,每个元素只被计算一次,彻底消除原代码中重复调用count()的冗余操作。 - 节省内存:直接将
chain返回的迭代器传入Counter,无需先转成列表,减少内存占用。 - 简化逻辑:因为每个元素只处理一次,不需要再判断元素是否已存在于频次列表中,代码更简洁。
测试验证
用你提供的测试矩阵:
matrix = [[0, 5, 1, 1, 0], [0, 2, 2, 2, 0], [1, 2, 4, 3, 1]]
调用函数返回[0, 1, 2],和预期结果一致。
内容的提问来源于stack exchange,提问作者Bsh
相关产品推荐
相关产品推荐

