1038 统计同成绩学生 Python 测试点4 运行超时解决

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 '')
优化的必要性

当数据集变大或查询次数增多时,遍历整个列表来查找每个查询项的出现次数会导致显著的性能瓶颈。因此,优化查询过程变得至关重要。

优化思路
  1. 预先计数:利用字典(哈希表)的特性,通过一次遍历预先计算列表中每个元素的出现次数。这样,每个元素只需被计算一次,而不是在每次查询时重复计算。

  2. 字典查询:字典在Python中是基于哈希表实现的,这意味着字典的查找操作平均是 O(1) 的时间复杂度。因此,使用字典查找每个查询项的出现次数比遍历整个列表更高效。

  3. 减少重复的类型转换:在处理用户输入时,避免在查询循环中重复转换数据类型,从而减少不必要的计算开销。

实施优化
  • 步骤1:通过一次遍历列表,创建一个字典来存储每个元素及其出现的次数。这个步骤的时间复杂度是 O(n)。
  • 步骤2:对于每个查询项,直接在字典中查找其出现次数。由于字典的查找时间复杂度是 O(1),所以即使有大量的查询项,总的查询时间仍然保持在一个可控范围内。
结果与影响

这种优化显著提高了程序处理大量数据的能力。在处理数以万计的元素和查询时,效率的提高尤为显著。此外,这种方法也减轻了CPU的计算负担,使程序更适用于资源受限的环境。

结论

这个案例展示了在编程中面对效率挑战时的常见策略:预先计算和缓存结果,以及利用合适的数据结构来提高查找效率。在编程和算法设计中,考虑到时间复杂度和数据结构的特性,对于处理大规模数据集的应用来说,这是至关重要的。通过这种方式,我们能够构建更加高效、响应更快的程序,从而提升用户体验和系统性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值