【发布时间】:2012-12-28 01:46:29
【问题描述】:
假设这首歌 i 已经播放了 fi 次,但 Zipf 定律预测它会
已播放zi 次。然后你定义歌曲i的质量为qi = fi/zi
.你的软件应该选择qi的最高值的歌曲。
输入的第一行包含两个整数n 和m(1 <= n < 50 000,1 <= m <= n),专辑中歌曲的数量,以及要选择的歌曲数量。然后按照n 行。这些行中的i'th 包含一个整数fi 和字符串si,其中0 <= fi@ 987654340@
是i'th 歌曲被收听的次数,si 是歌曲的名称。
每首歌曲名称最多包含 30 个字符,并且仅包含字符 a-z、0-9 和下划线 (_)。
输出质量最高的m首歌曲列表qi,按质量降序排列。如果两首歌曲质量相同,则优先考虑专辑中最先出现的那首(大概制作人有理由将那首歌曲放在另一首之前)。
sample input
4 2
30 one
30 two
15 three
25 four
sample output
four
two
我对 python 很陌生,我正在尝试解决这个难题,我认为我得到了正确的答案,但我必须做得更快,有什么建议吗?
from __future__ import division
def main():
import sys
from operator import itemgetter
data = sys.stdin.readlines()
line1 = data[0].split(" ")
numberofselect = line1[1]
qualitydict = {};
songdict = {};
a = 0
for x in range(1, len(data)):
item = data[x].split(" ");
item1 = item[1].split("\n");
f = float(item[0])
z = float(1/x)
qualitydict[item1[0]] = (f/z)
if ((f/z) in songdict.keys()):
songdict[(f/z)].append(item1[0])
else:
songdict[(f/z)] = [item1[0]]
items = songdict.items()
items.sort(key = itemgetter(0), reverse=True)
for key, value in items:
for element in value:
if (a < int(numberofselect)):
print element
a = a + 1
main();
【问题讨论】:
-
我会鼓励您try this method 找出代码的哪一部分花费的时间最多。
-
导入
from __future__ import division后,您无需通过float进行投射。执行fz = f/z并替换所有f/z。 -
我认为我需要保持浮动,因为我在某个点后会失去精度,因此得到错误的答案
标签: python performance optimization