【发布时间】:2016-09-13 20:07:49
【问题描述】:
我最近使用字典编写了一个 python 解决方案,它得到了 TLE 判决。该解决方案与 c++ 中的多集解决方案完全相似,它可以工作。所以,我们确信逻辑是正确的,但实现不达标。
理解下面代码的问题描述(http://codeforces.com/contest/714/problem/C):
- 对于每个数字,我们需要得到一个由 0 和 1 组成的字符串,如果相应的第 i 个数字是偶数/奇数,那么第 i 个数字是 0/1。
- 我们需要维护具有上述点给出的相同映射的数字计数。
任何提示/指针可以提高以下代码的性能?它为大型测试用例 (http://codeforces.com/contest/714/submission/20594344) 提供了 TLE (Time Limit Exceeded)。
from collections import defaultdict
def getPattern(s):
return ''.join(list(s.zfill(19)))
def getSPattern(s):
news = s.zfill(19)
patlist = [ '0' if (int(news[i])%2 == 0) else '1' for i in range(19) ]
return "".join(patlist)
t = int(raw_input())
pat = defaultdict(str) # holds strings as keys and int as value
for i in range(0, t):
oper, num = raw_input().strip().split(' ')
if oper == '+' :
pattern = getSPattern(str(num))
if pattern in pat:
pat[pattern] += 1
else:
pat[pattern] = 1
elif oper == '-' :
pattern = getSPattern(str(num))
pat[pattern] = max( pat[pattern] - 1, 0)
elif oper == '?' :
print pat.get(getPattern(num) , 0 )
【问题讨论】:
-
虽然不是性能调优方面的专家,但我希望字典查找性能相当高。我倾向于更多地研究
getSPattern函数,因为我相信可以从那里挤出一些东西。现在,在我们开始之前,我阅读了比赛,但无法得到时间限制的测量位置:它只是在'?' 测试? -
@sal 时间限制是根据每个测试用例执行来衡量的。因此,对于输入数字为 t 的大型测试用例,TLE 为 100000。如果您滚动到提交链接的最底部,您可以检查这一点。
-
知道了。试试这个版本:eval.in/641639 我只更改了你的
getSPattern,并去掉了defaultdict(尽管你可以保留它)。看看这是否会给您带来任何性能提升。如果是,那么我将添加一个包含更多详细信息的答案。 -
我的机器一旦从这次故障中恢复过来,肯定会尝试一下 :) askubuntu.com/q/824585/56429
-
@sal 我没有正确使用 defaultdict。您的代码已被接受。 codeforces.com/contest/714/submission/20615167
标签: python python-2.7 performance dictionary