Domanda

Qual è il modo più veloce per ordinare i valori in un array 2D liscio?

L'ingresso è una piccola immagine filtrata:

  • circa 60 per 80 pixel
  • singolo canale
  • singolo o doppio galleggiante precisione
  • maggiore stoccaggio fila, sequenziale nella memoria
  • segno
  • I valori hanno mescolato
  • a tratti "liscio", con le regioni dell'ordine di 10 pixel di larghezza

uscita è un (circa 4800 valore) matrice piatta dei valori ordinati, insieme con gli indici che ordinare l'array originale.

È stato utile?

Soluzione 3

I martellato fuori un punto di riferimento rapido e sporco su alcune immagini utilizzando routine di ordinamento del numpy sulla matrice piana. Questo è in media su un qualche centinaio di immagini casuali e qualche centinaio di immagini di volti umani. Entrambi sono singola precisione.

On random images...
quicksort took 0.000153 seconds per image.
mergesort took 0.000170 seconds per image.
heapsort took 0.000241 seconds per image.
On real images...
quicksort took 0.000136 seconds per image.
mergesort took 0.000143 seconds per image.
heapsort took 0.000230 seconds per image.

Tutti gli algoritmi sembrano beneficiare della ordinamento parziale esistente, in particolare quicksort. Numpy non sembra avere una funzione lista merge ordinato, quindi non posso provare di pre-selezione delle righe, ahimè.

Altri suggerimenti

mi aspetto timsort per vincere questo dato che si avvale di "corre" nei dati.

Quicksort sarà normalmente essere veloce, ma c'è il rischio che si colpisce uno scenario peggiore. per esempio. alcune versioni di quickshort sono O (n ^ 2) quando somministrato già ordinato di ingresso. Il che non sarebbe molto amichevole se qualcuno ti ha dato il tipo sbagliato di immagine gradiente pieno ......

Ecco un idea un po 'folle - si potrebbe anche provare un passaggio Z-ordinazione ( link di Wikipedia ) che potrebbe consentire di usufruire di colori simili adiacenti in entrambe le dimensioni.

Mi piacerebbe iniziare con il Quicksort sul posto. i confronti a virgola mobile sono veloci sulla maggior parte dei processori (sicuramente molto più veloce rispetto alla allocazione necessaria per un mergesort).

C'è timsort, ma ho visto in diversi luoghi che è pensato per applicazioni con lenta a confronto; gli sviluppatori NumPy a quanto pare hanno deciso di non disturbare anche la sua attuazione:

http://mail.scipy.org/pipermail /scipy-dev/2009-May/011929.html

Si potrebbe Mergesort le righe singolarmente, e quindi unire le file ordinate.

Ciò almeno sfruttare alcuni di particolare struttura della matrice 2D, cioè il fatto che corre monotone tipicamente avviare e fermare sul bordo della matrice. Espone anche un altro paio di livelli di parallelismo.

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