Grokking timsort
Domanda
C'è un (relativamente) nuovo tipo sul blocco chiamato timsort. E 'stato usato come list.sort di Python, ed è ora di andare a essere la nuova Array.sort in Java 7 .
alcuni documentazione e un piccolo articolo di Wikipedia che descrive le proprietà di alto livello del genere e alcune valutazioni delle prestazioni di basso livello, ma ero curioso se qualcuno può fornire qualche pseudocodice per illustrare ciò che timsort sta facendo, esattamente, e quali sono le cose fondamentali che lo rendono scattante. (Esp. Per quanto riguarda la carta citato, "ottimista Ordinamento e informazione teorica complessità".)
(Vedi anche StackOverflow posta .)
Soluzione
Citando la quota di competenza da un post ora cancellato: la visualizzazione di algoritmi di ordinamento: Python timsort
Il business-end di timsort è un Mergesort che opera su percorsi di elementi pre-assortiti. Un minrun minimo tiratura viene scelto per assicurarsi che le fusioni finali sono il più possibile equilibrato - per 64 elementi, minrun sembra essere 32. Prima di iniziare a unire, un singolo passaggio viene effettuata attraverso i dati per rilevare corse pre-esistenti filtrate elementi. piste che scendono sono gestite da semplicemente invertendo posto. Se la lunghezza dei tratti risultante è inferiore minrun, si è incrementata fino minrun utilizzando inserzione. Su una matrice mescolato con significative corse pre-esistenti, questo processo appare esattamente come la nostra ipotesi di cui sopra: pre-selezione blocchi di elementi minrun utilizzando insertion sort, prima di fondersi con merge sort
.
[...]
- timsort trova una corsa discendente, e inverte la corsa sul posto. Questo viene fatto direttamente sulla matrice di puntatori, così sembra "istantanea" dal nostro punto di osservazione.
- La corsa è ora incrementato a lunghezza minrun utilizzando inserzione.
- n corsa viene rilevato all'inizio del blocco successivo, e inserzione viene utilizzato per ordinare l'intero blocco. Si noti che gli elementi ordinati nella parte inferiore di questo blocco non sono trattati in modo speciale -. Timsort non rileva corse che iniziano nel mezzo di blocchi essere potenziato per minrun
- Infine, Mergesort è utilizzato per fondere le piste.
Altri suggerimenti
Questo cambiamento ha attraversato le core-libs mailing list quando è andato in cui v'è una certa discussione e link utili là. Ecco le web RM con modifiche revisione del codice e anche il < a href = "http://cr.openjdk.java.net/~martin/webrevs/openjdk7/timsort/timsort.patch" rel = "nofollow noreferrer"> originale di patch .
I commenti nel codice dicono:
Nota implementativa: Questa implementazione è una stalla, adattativo,
Mergesort iterativo che richiede molto meno di n lg (n) confronti
quando la matrice di ingresso è parzialmente ordinato, offrendo la
prestazioni di un tradizionale Mergesort quando la matrice di ingresso è
casualmente ordinato. Se la matrice di ingresso è quasi ordinato, il
attuazione richiede circa n confronti.
requisiti di stoccaggio temporaneo variano da una piccola costante per
quasi ordinato array in input a N / 2 riferimenti dell'oggetto per casualmente ordinato ingresso
array.L'applicazione prende uguale vantaggio di ascendenti e
ordine decrescente nella sua matrice di ingresso, e possono sfruttare
ordine crescente o decrescente in diverse parti della stessa
array di input. E 'ben adatto per la fusione di due o più matrici ordinate:
semplicemente concatenare i matrici e ordinare la matrice risultante.
L'implementazione è stata adattata da Tim Peters elenco di ordinamento per Python
timsort . Esso utilizza techiques da "
Optimistic di Peter McIlroy Ordinamento e informazioni teorico Complessità", in Atti del
Quarto Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
Gennaio 1993.
sepolto nella v'è la collegamento molto utile per i dettagli di implementazione di Python , e penso che sia un ottimo punto di partenza, seguito dal codice. Per essere incredibilmente alto livello su di esso, timsort migliora le prestazioni notando piste di dati ordinati e approfittando di tale struttura durante l'ordinamento.