if __name__ == '__main__':
num = int(input())
source_str = input().split(' ')
l = [int(x) for x in source_str]
# 预先计算每个数字出现的次数
counts = {}
for num in l:
if num in counts:
counts[num] += 1
else:
counts[num] = 1
target_str = input().split(' ')
targets = [int(x) for x in target_str[1:]] # 预先转换为整数
for i, target in enumerate(targets):
print(counts.get(target, 0), end=' ' if i != len(targets)-1 else '')
一开始测试点4 运行超时。所以我进行了优化,复盘一下我优化的过程。
在处理特定的编程任务时,我们常常遇到需要优化数据处理效率的挑战。这个具体案例涉及到从Python列表中查询数据,并计算列表中特定元素出现的次数。这个任务在数据量较大时显得尤为重要。
原始代码逐个处理用户输入的查询项,对于每个查询项,都在列表中遍历寻找匹配并计数。这种方法在数据量小且查询次数少时可能表现良好,但在面对大数据集和频繁的查询时,其效率大大降低。具体来说,这种方法的时间复杂度是 O(nm),其中 n 是列表长度,m 是查询次数。
if __name__ == '__main__':
num = int(input())
source_str = input().split(' ')
l = [int(x) for x in source_str]
target_str = input().split(' ')
for i in range(int(target_str[0])): # 3 75 90 88, 0 1 2 3 当 i = 2 的时候 打印 字符列表下标为3的88的时候不要输出空格
print(l.count(int(target_str[i+1])), end=' ' if i != int(target_str[0])-1 else '')
当数据集变大或查询次数增多时,遍历整个列表来查找每个查询项的出现次数会导致显著的性能瓶颈。因此,优化查询过程变得至关重要。
预先计数:利用字典(哈希表)的特性,通过一次遍历预先计算列表中每个元素的出现次数。这样,每个元素只需被计算一次,而不是在每次查询时重复计算。
字典查询:字典在Python中是基于哈希表实现的,这意味着字典的查找操作平均是 O(1) 的时间复杂度。因此,使用字典查找每个查询项的出现次数比遍历整个列表更高效。
减少重复的类型转换:在处理用户输入时,避免在查询循环中重复转换数据类型,从而减少不必要的计算开销。
这种优化显著提高了程序处理大量数据的能力。在处理数以万计的元素和查询时,效率的提高尤为显著。此外,这种方法也减轻了CPU的计算负担,使程序更适用于资源受限的环境。
这个案例展示了在编程中面对效率挑战时的常见策略:预先计算和缓存结果,以及利用合适的数据结构来提高查找效率。在编程和算法设计中,考虑到时间复杂度和数据结构的特性,对于处理大规模数据集的应用来说,这是至关重要的。通过这种方式,我们能够构建更加高效、响应更快的程序,从而提升用户体验和系统性能。