Я пытаюсь решить , и хотя решение (см. Код ниже) работает правильно, это слишком медленно для успешной подачи.Python: ускорить удаление каждого n-го элемента из списка
- Любые указатели, как это сделать быстрее (удаление каждого n-го элемента из списка)?
- Или предложения по лучшему алгоритму для вычисления того же самого; Кажется, я не могу думать ни о чем еще, кроме грубой силы на данный момент ...
В принципе, задача состоит в том:
GIVEN: L = [2,3,4,5,6,7,8,9,10,11,........] 1. Take the first remaining item in list L (in the general case 'n'). Move it to the 'lucky number list'. Then drop every 'n-th' item from the list. 2. Repeat 1 TASK: Calculate the n-th number from the 'lucky number list' (1 <= n <= 3000)
Мой исходный код (он вычислил первые повезло 3000 числа в около секунды на моей машине - к сожалению, слишком медленный):
"""
SPOJ Problem Set (classical) 1798. Assistance Required
URL: http://www.spoj.pl/problems/ASSIST/
"""
sieve = range(3, 33900, 2)
luckynumbers = [2]
while True:
wanted_n = input()
if wanted_n == 0:
break
while len(luckynumbers) < wanted_n:
item = sieve[0]
luckynumbers.append(item)
items_to_delete = set(sieve[::item])
sieve = filter(lambda x: x not in items_to_delete, sieve)
print luckynumbers[wanted_n-1]
EDIT: благодаря потрясающий вклад Марка Дикинсон, Steve Джессоп и gnibbler, I получили в следующем, что довольно много быстрее, чем мой исходный код (и успешно получил представленный на http://www.spoj.pl с 0,58 секунд!) ...
sieve = range(3, 33810, 2)
luckynumbers = [2]
while len(luckynumbers) < 3000:
if len(sieve) < sieve[0]:
luckynumbers.extend(sieve)
break
luckynumbers.append(sieve[0])
del sieve[::sieve[0]]
while True:
wanted_n = input()
if wanted_n == 0:
break
else:
print luckynumbers[wanted_n-1]
Как быстро вам это нужно быть? Сколько меньше секунды, примерно на каком оборудовании? –
Не проблема просто попросить вас сгенерировать n-мерное число? –
@Steve Jessop: Мне нужно вычислить несколько тестовых случаев для n (всегда <3000) в течение 1 секунды. Скрипт работает в специальной тестовой среде в http://www.spoj.pl, и я не нашел никаких подсказок об аппаратном обеспечении. Когда вы переходите на 1 секунду, вы получаете только «предел времени» (без точного времени выполнения) ... – ChristopheD