TLE всегда происходит в SBANK SPOJ с использованием python. Чтобы решить эту проблему, мне нужно отсортировать dict()
, хотя dict()
имеет огромное количество KEYS
(максимум - 100000). Использовать функцию sorted()
в моем коде не влияет. Есть ли быстрое решение? Спасибо за вашу помощь.Как быстро сортировать dict() с огромным количеством ключей?
Мой код ниже:
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: Согласно кончиков Джастина Джона Пила, я обновить мой код ниже, но вернуться еще 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]))
Нет необходимости в 'lst = list()'. Кроме того, использование 'setdefault' сильно замедлит вас. Быстрее проверить явно, если 'account' находится в' dic', добавить 1, если true, и установить 1, если не true. Кроме того, использование 'readline()' снова и снова не является отличным способом сделать это. Вы можете 'read()' весь файл и использовать некоторую переменную в качестве индекса, который вы перемещаете вручную, или, поскольку строки учетной записи имеют одинаковую длину, вы можете читать все строки, которые вам нужны, read (correct_number_of_chars) ', а затем разделите их на новую строку. 'rstrip()' также замедляет вас. –
@ Justin Peel Большое спасибо за вашу помощь. – Jason
@ Justin Peel Эй, у меня есть AC, спасибо за ваши советы. Кстати, я виноват, что не обернуть процесс в функцию с помощью модуля psyco. – Jason