Quicksort e non preoccuparti?


9

Soprattutto quando si scrivono applicazioni 'standard' (non HPC), consideri quale algoritmo di ordinamento scegliere, o semplicemente accontentarsi di quicksort (che è quello che la maggior parte delle biblioteche chiama ordinamento)? In una certa misura può essere redditizio in situazioni specifiche, ma d'altra parte un'ottimizzazione corretta richiede del tempo per analizzare il problema e fare benchmark.

Risposte:


12

In generale, l'utilizzo dei metodi predefiniti a meno che non vi sia una necessità specifica di fare qualcosa di più esotico mantiene tutto molto più leggibile / comprensibile lungo la strada IMHO.

Se si verifica (o in alcuni casi, si sospetta fortemente) di avere un problema di prestazioni che è il momento di aggiungere complessità.

D'altra parte, se stai usando un linguaggio abbastanza basso che non esiste un ordinamento integrato per il tipo di oggetti che devi ordinare, prova a sceglierne uno o due che coprano tutte le tue basi e implementarle.


6

Chiama sempre le routine di libreria fornite, a meno che tu non abbia ottime, ottime ragioni per non farlo (e devi documentare perché è così).

Questo perché gli algoritmi di ordinamento sono difficili da ottenere assolutamente giusti. Si è verificato un errore nel quicksort Java con set di dati molto grandi, che è stato identificato, risolto e consegnato ai clienti da Sun, quindi non è stato necessario.

Anche l'ordinamento predefinito in Java 7 è stato aggiornato a un ordinamento più recente e migliore. Anche gratis.

A meno che l'ordinamento predefinito è dimostrabilmente non è buona abbastanza per voi, bastone con esso.


3

Una volta, durante una conferenza, ho sentito una bella storia a riguardo.

A Microsoft qualcuno stava scrivendo un'app VB (c. VB 3) e ha inviato un gruppo di persone dicendo che aveva un sacco di valori e voleva che apparissero nella casella combinata in ordine, come avrebbe dovuto farlo.

Ognuno si è tuffato per i suoi vecchi libri di testo di informatica, cercando routine altamente efficienti e portandole su Visual Basic e inviandole per posta. Un ragazzo ha appena rispedito "quanti valori nella casella combinata?".

"Circa 50" è arrivata la risposta.

"Basta impostare la proprietà ordinata su TRUE".

Nel 99,9999% di casi l'ordinamento viene eseguito meglio utilizzando una libreria, un controllo o nella selezione SQL poiché la differenza di prestazioni tra la routine della libreria e tutto ciò che si scrive sarà trascurabile e lo sforzo e la manutenzione generali supereranno enormemente le conseguenze.


1

Questo è il momento di estrarre la classica citazione sull'ottimizzazione prematura. Nella maggior parte dei casi, non importa davvero. Cavolo, con la velocità delle CPU in questi giorni, potresti probabilmente mettere in bolla la maggior parte dei set di dati e non notare molto. Ma quando si ordinano set di dati di dimensioni molto grandi e l'ordinamento delle prestazioni inizia a diventare un problema, è necessario esaminare sicuramente altre opzioni.


Ordinamento delle bolle? Le sue prestazioni sono le peggiori per il caso medio e il caso peggiore e equivalgono all'ordinamento per inserzione nel caso migliore. Non c'è motivo per cui dovrebbe essere usato.
Ippopotamo

1
@Hippo: in realtà non stavo sostenendo l'uso del bubble sort. Volevo dire che i computer moderni sono abbastanza veloci che nella maggior parte dei casi non importa quanto sia lento il tuo algoritmo perché l'utente non se ne accorgerà.
Mason Wheeler,

Che ne dici di Bogosort ?
dsimcha,

0

Anche se ovviamente non ha importanza per i bit e le scadenze. Trovo che il tipo di unione sia più facile da scrivere e da comprendere rispetto a quicksort. Quindi, se ho intenzione di scrivere il mio algoritmo di ordinamento, lo userei.


Viva mergesort! E un termine costante leggermente migliore, e nessun orribile caso peggiore.
Frank Shearar,

0

Almeno in una biblioteca scritta con competenza, mi aspetto che il built-in sortsia implementato come Introsort piuttosto che come Quicksort. La differenza raramente conta molto, ma Introsort elimina le cattive prestazioni nel caso peggiore di Quicksort con un effetto minimo sui casi più comuni.

Per rispondere alla tua domanda, tuttavia: sì, è quello che dovresti iniziare di solito, e fino a quando / a meno che tu non abbia risultati di profiler che indicano che è un problema, è lì che dovrebbe rimanere.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.