Ecco un modello abbastanza comune per gli algoritmi di ordinamento:
def sort(l):
while not is_sorted(l):
choose indices i, j
assert i < j
if l[i] > l[j]:
l[i], l[j] = l[j], l[i]
Questi algoritmi funzionano bene perché gli indici i
e j
sono scelti con cura, in base allo stato della lista l
.
Tuttavia, se non potessimo vedere l
e dovessimo scegliere alla cieca? Quanto velocemente potremmo ordinare l'elenco allora?
La tua sfida è scrivere una funzione che genera una coppia casuale di indici, data solo la lunghezza di l
. In particolare, è necessario generare due indici i, j
, con 0 <= i < j < len(l)
. La tua funzione dovrebbe funzionare su qualsiasi lunghezza dell'elenco, ma verrà assegnata un punteggio su un elenco di lunghezza 100.
Il tuo punteggio è il numero medio di scelte di indice necessarie per ordinare un elenco mescolato in modo uniformemente casuale secondo lo schema sopra, in cui gli indici sono scelti in base alla tua funzione.
Segnerò le osservazioni, prendendo il numero medio di scelte di indice su 1000 prove in un elenco mischiato in modo uniformemente casuale di lunghezza 100 senza voci ripetute.
Mi riservo il diritto di eseguire meno prove se la presentazione è chiaramente non competitiva o non termina e eseguirò più prove per differenziare i migliori concorrenti per trovare un singolo vincitore. Se più invii principali rimangono entro il margine di errore al limite delle mie risorse computazionali, dichiarerò il precedente invio il vincitore, fino a quando ulteriori risorse computazionali potranno essere utilizzate.
Ecco un esempio di programma di punteggio, in Python:
import random
def is_sorted(l):
for x in range(len(l)-1):
if l[x] > l[x+1]:
return False
return True
def score(length, index_chooser):
steps = 0
l = list(range(length))
random.shuffle(l)
while not is_sorted(l):
i, j = index_chooser(length)
assert (i < j)
if l[i] > l[j]:
l[i], l[j] = l[j], l[i]
steps += 1
return steps
La tua funzione potrebbe non mantenere uno stato mutabile, interagire con variabili globali, influire sull'elenco l
, ecc. L'unico input della tua funzione deve essere la lunghezza dell'elenco l
e deve generare una coppia ordinata di numeri interi nell'intervallo [0, len(l)-1]
(o appropriato per la tua lingua indicizzazione elenco). Sentiti libero di chiedere se qualcosa è permesso nei commenti.
Gli invii possono essere in qualsiasi lingua gratuita. Si prega di includere un imbragatura se uno non è già stato pubblicato nella tua lingua. Puoi pubblicare un punteggio provvisorio, ma lascerò un commento con il punteggio ufficiale.
Il punteggio è il numero medio di passaggi per un elenco ordinato in un elenco mischiato in modo uniformemente casuale di lunghezza 100. Buona fortuna.