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 .)

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top