TLE总是发生在使用python的SBANK SPOJ中。为了解决这个问题,我必须对dict()进行排序,尽管dict()有大量的KEYS(最大-100000)。在我的代码中使用sorted()函数没有效果。有什么快速解决办法吗?谢谢你的帮助。
我的代码如下:
for j in range(n): # n is the number of keys
account = sys.stdin.readline().rstrip()
dic.setdefault(account, 0)
dic[account] += 1
sorted(dic) # **this sort take a lot of time**EDIT1:According到Justin的提示,我在下面更新我的代码,但仍然返回TLE。我该怎么做?
import sys
import psyco # import psyco module to speed up
psyco.full()
nCase = int(sys.stdin.readline().split()[0])
for i in range(nCase):
n = int(sys.stdin.readline().split()[0])
dic = dict()
lst = list()
for j in range(n):
account = sys.stdin.readline().rstrip()
dic.setdefault(account, 0)
dic[account] += 1
sys.stdin.readline()
lst = dic.keys() # store keys in list
lst.sort()
for account in lst:
sys.stdout.write('%s %s\n' % (account, dic[account]))发布于 2011-03-16 04:07:11
我解决了这个问题。以下是一些建议:
keys = mydict.keys(); keys.sort(),因为这是最快的方法。发布于 2011-03-16 02:57:53
dict没有排序,这就是它们如何提供O(1)插入和获取访问的方式。(我相信,在内部,它们是作为哈希表实现的,尽管我不确定这是Python规范所要求的)。
如果要按排序顺序迭代dict的键,可以使用:
for key in sorted(the_dict.iterkeys()):
value = the_dict[key]
# do something但是,正如您注意到的,对10万个元素进行排序可能需要一些时间。
作为另一种选择,您可以编写(或在互联网上找到)排序的dict实现,这些实现与字典一起保留一个有序的键列表,并支持按键快速查找,并按照顺序进行迭代,而不必一次排序。当然,为了支持排序顺序,键需要在插入时进行排序,所以插入不会是O(1)。
编辑:按德索里马诺的注释,如果您使用的是Python2.7或Python3.x,则有一个内置的OrderedDict类,它按照插入顺序排序迭代,这样可以保持插入速度,但可能无法完成所需的操作(取决于所需项的顺序)。
发布于 2011-03-16 03:09:35
由于Python3.1是可用的,所以collections.Counter很适合这个目的:
collections.Counter(map(str.rstrip, sys.stdin)).most_common()https://stackoverflow.com/questions/5320497
复制相似问题