Sto cercando di risolvere e sebbene la soluzione (vedere il codice sottostante) funzioni correttamente, è troppo lenta per l'inoltro riuscito.Python: velocizzare la rimozione di ogni n-esimo elemento dalla lista
- Qualsiasi suggerimento su come eseguire questa corsa più veloce (rimozione di ogni n-esimo elemento da un elenco)?
- Oppure suggerimenti per un algoritmo migliore per calcolare lo stesso; Sembra che io non riesco a pensare a niente altro che forza bruta per ora ...
In sostanza, l'operazione attuale è:
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)
mio codice originale (si calcola il 3000 prima fortunata numeri in circa un secondo sulla mia macchina - purtroppo troppo 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: grazie ai i contributi formidabili di Mark Dickinson, Steve Jessop e gnibbler, io ottenuto al seguente, che è piuttosto un bel po 'più veloce rispetto al mio codice originale (e con successo ma ho presentato al http://www.spoj.pl con 0,58 secondi!) ...
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]
Quanto velocemente l'avete bisogno di essere? Quanto meno di un secondo, approssimativamente su quale hardware? –
Il problema non è quello di chiederti di generare l'ennesimo numero primo? –
@Steve Jessop: Devo calcolare diversi casi di test per n (sempre <3000) entro 1 secondo. Lo script viene eseguito in uno speciale ambiente di test all'interno di http://www.spoj.pl e non ho trovato alcun indizio sull'hardware. Quando passi oltre 1 secondo ottieni solo un 'limite di tempo superato' (senza un tempo di esecuzione preciso) ... – ChristopheD