私は最近、dictoionariesを使ってPythonソリューションをコーディングしました。このソリューションは、動作するC++のマルチセットソリューションとまったく同じです。したがって、ロジックは正しいと確信していますが、実装はマークまではありません。python dictのパフォーマンスを改善するには?
コード以下の理解(http://codeforces.com/contest/714/problem/C)のための問題の説明:数字i番目の0/1であるように、我々は0と1の文字列を取得する必要がある番号ごと
- かの数のそれぞれのi番目の桁偶数/奇数です。
- 上記のポイントで与えられたマッピングと同じマッピング数を維持する必要があります。
以下のコードのパフォーマンスを向上させるヒント/ポインターはありますか?大規模なテストケース(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)
perfチューニングの専門家ではありませんが、辞書検索のパフォーマンスはかなり高いと思います。私は何かがそこから絞られることができると信じているように、その 'getSPattern'関数をさらに調べる傾向があります。さて、私たちが始める前に、私はコンテストを読みましたが、時間制限が測定される場所には到着することができませんでした。 'テスト? –
sal
@salの時間制限は、テストケースの実行ごとに測定されます。したがって、入力番号が100000のTLEを与える大規模なテストケースでは、送信リンクの一番下にスクロールすると、これをチェックすることができます。 – mtk
入手しました。このバージョンを試してみてください:https://eval.in/641639ここで私はあなたの 'getSPattern'だけを変更し、' defaultdict'を取り除きました(あなたはそれを保つことができますが)。それがパフォーマンスを向上させるかどうかを確認してください。はいの場合は、詳細を記した回答を追加します。 – sal