Estoy tratando de resolver y aunque la solución (ver código a continuación) funciona correctamente, es demasiado lento para la presentación exitosa.Python: acelerar la eliminación de cada elemento n-ésimo de la lista
- Cualquier punteros como la forma de hacer esta carrera más rápido (eliminación de todos los elementos de orden n de una lista)?
- O sugerencias para un mejor algoritmo para calcular el mismo; Parece que no puedo pensar en nada más que de fuerza bruta por ahora ...
Básicamente, la tarea actual es:
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)
Mi código original (se calcula la primera suerte 3000 números en alrededor de un segundo en mi máquina - por desgracia demasiado lento):
"""
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: gracias a las contribuciones terribles de Mark Dickinson, Steve Jessop y gnibbler, me conseguido en el siguiente, lo cual es bastante mucho más rápido que mi código original (y con éxito consiguió presentado en http://www.spoj.pl con 0.58 segundos!) ...
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]
¿Qué tan rápido que necesita ser? ¿Cuánto menos de un segundo, en aproximadamente qué hardware? –
¿No es el problema solo pedirle que genere el enésimo número primo? –
@Steve Jessop: Tengo que calcular varios casos de prueba para n (siempre <3000) en 1 segundo. La secuencia de comandos se ejecuta en un entorno de prueba especial dentro de http://www.spoj.pl y no he encontrado pistas sobre el hardware. Cuando superas 1 segundo solo obtienes un 'límite de tiempo excedido' (sin un tiempo de ejecución preciso) ... – ChristopheD