为什么这个代码比我的效率高?

2024-09-30 20:27:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习如何使用这个网站使用Hankerak制作python。我遇到了this problem,我编写的代码没有通过一些测试,因为超过了时间限制。所以我上了youtube,使用了一个教程,他的代码很有效,但我不明白为什么他的代码比我的更有效。如果有人能解释一下,我将不胜感激

我的代码:

room=list(map(int, input().split()))
room.sort()
roomset=set(room.copy())

for i in roomset:
    if room.count(i)!=K:
        print(i)
    else:
        continue

教程代码:

room=list(map(int, input().split()))
room.sort()
a=set()
b=set()

for i in room:
    if i not in a:
        a.add(i)
        b.add(i)
    else:
        b.discard(i)
        
for o in b:
    print(o)

Tags: 代码inmapforinputif教程sort
3条回答

因为For looproom.count(i)给出了O(n)*O(n)=O(n**2)时间复杂度。而教程解等于O(n)

超过时间意味着你做的工作比要求的多

room.sort()-你为什么要sort列出房间号码?代码没有利用它。(奇怪,另一个代码也这么做了,我是否忽略了什么?)

roomset=set(room.copy())-无需复制

但主要的问题不是:一个房间号码在列表中出现了多少次?,而是:它到底是1吗?。如果你第二次遇到房间号码,你有答案,你应该停止计数

更高效的代码就是这样做的。它会记住是否看到房间号(seta)以及它是否是第一次出现(setb)。不计算,即只需浏览列表一次即可-这是一项重要的效率改进。检查完所有数字后,集合b只包含一个项目,且只出现一次

代码运行缓慢的原因是,在循环的每次迭代中,python都需要扫描整个列表以计算该数字出现的次数。这意味着在最坏的情况下,操作的数量会随着输入大小的平方而增加,这会花费很长时间

本教程的代码只保留一组至少遇到过一次的数字(a),以及一组恰好遇到过一次的数字(b)。插入、删除和检查成员资格的集合操作都是常数时间,因此其算法的时间随输入长度线性增长

相关问题 更多 >