Perché la ricerca binaria, che necessita di dati ordinati, è considerata migliore della ricerca lineare?


20

Ho sempre sentito che la ricerca lineare è un approccio ingenuo e la ricerca binaria è migliore di quella nelle prestazioni a causa della migliore complessità asintotica. Ma non ho mai capito perché è meglio della ricerca lineare quando è richiesto l'ordinamento prima della ricerca binaria?

La ricerca lineare è O(n)e la ricerca binaria è O(log n). Questa sembra essere la base per dire che la ricerca binaria è migliore. Ma la ricerca binaria richiede l'ordinamento che è O(n log n)per i migliori algoritmi. Quindi la ricerca binaria non dovrebbe essere effettivamente più veloce in quanto richiede l'ordinamento.

Sto leggendo CLRS in cui l'autore implica che nell'ordinamento per inserzione invece di utilizzare l'approccio di ricerca lineare ingenuo è meglio usare la ricerca binaria per trovare il luogo in cui l'elemento deve essere inserito. In questo caso questo sembra essere giustificato poiché ad ogni iterazione di loop esiste un elenco ordinato su cui è possibile applicare la ricerca binaria. Ma nel caso generale in cui non esiste alcuna garanzia in merito al set di dati in cui è necessario effettuare la ricerca, la ricerca binaria non è effettivamente peggiore della ricerca lineare a causa dei requisiti di ordinamento?

Ci sono considerazioni pratiche che sto trascurando che rendono la ricerca binaria migliore della ricerca lineare? Oppure la ricerca binaria è considerata migliore della ricerca lineare senza considerare il tempo di calcolo richiesto per l'ordinamento?


6
Come per tante altre cose, tutto si riduce a: "Dipende ...;)"
Jeff B

Se l'elenco è già ordinato, pensi che la ricerca lineare sia ancora migliore? Potrebbe essere qualcosa da considerare qui.
JB King,

3
Per chiunque stia pensando di cambiare il titolo , per favore non togliere la parte sui dati ordinati perché rimuoverlo fa sembrare una domanda completamente diversa.
Aseem Bansal,

Risposte:


53

Ci sono considerazioni pratiche che sto trascurando che rendono la ricerca binaria migliore della ricerca lineare?

Sì: devi eseguire l'ordinamento O (n log n) una sola volta, quindi puoi eseguire la ricerca binaria O (log n) tutte le volte che vuoi, mentre la ricerca lineare è O (n) ogni volta.

Naturalmente, questo è solo un vantaggio se si eseguono più ricerche sugli stessi dati. Ma gli scenari "scrivi una volta, leggi spesso" sono abbastanza comuni.


Se stai facendo qualcosa solo una volta, non è molto utile ottimizzarlo.

14

Il presupposto di base è che non si effettua una ricerca.

Quindi, se hai bisogno di cercare gli stessi dati più volte, devi solo ordinare una volta e puoi trarre profitto dalla ricerca binaria.

Se stai effettuando una ricerca spesso e disponi di dati che cambiano, vale la pena utilizzare un elenco ordinato in cui le nuove voci sono ordinate nell'elenco.

Quindi, in sostanza, la ricerca binaria è migliore quando si cerca più volte lo stesso elenco senza la necessità di ricorrere.

Quando è necessario ordinare ogni volta prima di cercare non ci sono vantaggi.

Si prega di notare che ci sono algoritmi di ordinamento che sono molto veloci quando l'elenco è già ordinato (o quasi ordinato). La maggior parte delle determinazioni delle prestazioni prevede un elenco non ordinato.


2
Se cerchi spesso e inserisci spesso, potresti guardare strutture di dati più complicate (ad esempio alberi binari).
MarkJ,

@MarkJ la domanda di base del poster originale riguardava la ricerca in un elenco. Altrimenti sono completamente d'accordo con te.
Uwe Plonus l'

7

perché una volta che hai un elenco ordinato non è necessario riordinarlo ogni volta, il che significa che se hai più di O (log n) le ricerche in anticipo ordineranno una vincita ( O(n log n + k log n)vsO(k*n)


5

Immagina due rubriche telefoniche.

Una rubrica ha i nomi in ordine alfabetico. Per trovare la voce desiderata, apri nel mezzo, controlla la voce, quindi vai avanti o indietro a seconda che tu abbia superato o meno.

L'altra rubrica ha i nomi in ordine casuale. Per trovare la voce desiderata, iniziare dall'inizio e continuare fino a trovare quello desiderato.

Il secondo libro funzionerà in qualsiasi città di dimensioni ragionevoli?


3

Penso che il valore della ricerca binaria rispetto alla ricerca lineare sia contestuale. Se inizi con un enorme set di dati non ordinati e prevedi solo di estrarre un piccolo numero di elementi da esso, l'ordinamento e l'esecuzione di una ricerca binaria saranno lenti. Se, tuttavia, conservi un elenco ordinato per tutta la durata della tua applicazione e accedi regolarmente, la ricerca binaria è un modo molto migliore di procedere.


3

Come molti altri hanno risposto, la ricerca binaria è davvero preferibile perché la fase di ordinamento può essere eseguita solo una volta e la ricerca effettiva può essere eseguita tutte le volte che vuoi. Tuttavia, per determinati valori di n (ovvero determinate dimensioni di input), la ricerca binaria è sempre più performante della ricerca lineare (anche per una singola corsa).

Il "punto di non ritorno" viene calcolato risolvendo l'equazione della complessità asintotica:

n log n + log n = n

Come puoi vedere su Wolfram Alpha, esiste un valore numerico per n che garantisce che la ricerca e l'ordinamento binari siano sempre più veloci della sola ricerca lineare. Naturalmente il valore effettivo di n che funziona nel tuo caso dipende da molti fattori che possono essere difficili da stimare.

Secondo questo interessante articolo di Mark Probst, che include alcune misurazioni approfondite delle prestazioni sui processori attuali:

Se hai bisogno di cercare in una matrice ordinata di numeri interi e le prestazioni sono davvero molto importanti, usa la ricerca lineare se la tua matrice ha dimensioni inferiori a circa 64 elementi, ricerca binaria se è sopra.


2

Nelle parole di laici:

Se hai un elenco non ordinato con dieci miliardi di articoli e l'articolo che stai cercando è l'ultimo, finirai per leggere i dieci miliardi di articoli.

Nel caso della ricerca binaria, l'indicizzazione può essere eseguita una sola volta. Inserimenti successivi possono essere effettuati nel posto giusto per mantenere l'ordine.


2

Sebbene siano già stati elencati molti buoni motivi per "la ricerca binaria è migliore", potremmo anche dare un'occhiata ai vantaggi dal punto di vista dell'utente:

Mentre normalmente puoi vivere molto bene con il piccolo tempo di attesa diviso tra le azioni di immissione dei dati quando esegui un inserimento ordinato, vuoi che la "ricerca" sia il più veloce possibile. Dal punto di vista dell'utente, l'inserimento ordinato combinato con una ricerca binaria offre la migliore esperienza utente possibile.

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.