Questo algoritmo può ancora essere considerato un algoritmo di ricerca binaria?


14

Mentre eseguo il secondo codice kata (che ti chiede di implementare un algoritmo di ricerca binaria cinque volte, ogni volta con un metodo diverso), ho trovato una soluzione leggermente diversa che funziona come segue:

Se ho una matrice ordinata di lunghezza 100 e vedo che il suo campo iniziale contiene il numero 200 e il suo campo finale contiene il numero 400, io, come un matematico che studia umano, probabilmente inizierei a cercare intorno al campo 35 se stavo cercando il numero 270 e non il campo 50 come in un normale algoritmo di ricerca binaria.

Quindi, se il numero sul campo 35 dell'array è 270, 35 è l'indice che stavo cercando.

In caso contrario, posso confrontare il numero ottenuto (ad esempio 280) e ripetere l'operazione prendendo la parte inferiore dell'array (quindi ho 35 campi con il campo iniziale contenente 200 e il campo finale contenente 280) se il il numero che ho trovato è maggiore di quello che sto cercando, o la parte superiore dell'array (diciamo che ho ottenuto 260: ora ho 65 indici, il primo contenente 260 e l'ultimo contenente 400. Orientativamente, andrei avanti indice 4 di questo array secondario, che è l'indice 39 dell'intero array) se il numero ottenuto è inferiore al numero che sto cercando.

La domanda è: questo algoritmo può essere considerato un algoritmo di ricerca binaria? In caso contrario, ha il suo nome?


2
Che si tratti di ricerca binaria o meno, sembra essere puramente una questione di opinione. In sostanza, l'unica risposta che puoi dare è "Sì, è abbastanza vicino alla ricerca binaria per chiamarla ricerca binaria" o "No, non lo è." Segue l'argomento.
David Richerby,

Risposte:


23

Non la definirei una ricerca binaria.

È chiaramente simile alla ricerca binaria ed è naturale vederlo come un perfezionamento della ricerca binaria. Tuttavia ha caratteristiche di complessità dell'algoritmo significativamente diverse, la ricerca di interpolazione ha previsto il tempo di esecuzione di O (log (log (n)) supponendo che i dati siano distribuiti uniformemente, tuttavia paga per questo avendo O (n) tempo di esecuzione peggiore.

Preferisco dire "Il tempo di esecuzione peggiore della ricerca binaria è O (log (n))" piuttosto che "A seconda della scelta degli elementi limite, il tempo di esecuzione peggiore della ricerca binaria è O (log (n))". Ciò significa che non posso classificare la ricerca di interpolazione come algoritmo di ricerca binaria.


Presumibilmente se si interrompe la ricerca di interpolazione quando sta andando male, è possibile conservare O (log n) nel caso peggiore e O (log log n) su dati sufficientemente lineari. La mia ipotesi è che qualcosa come "se non ho trovato la destinazione dopo i tentativi di log n quindi passa alla ricerca binaria" funzionerà, ma sono troppo pigro per dimostrarlo. Naturalmente ci sarà una classe di input killer su cui ciò richiede sostanzialmente il doppio della ricerca binaria.
Steve Jessop,

Questa idea di input killer è interessante. E se invece di consentire agli input killer di influire negativamente sulla ricerca (ovvero dividendo vicino alla fine di un array), limitiamo / tagliamo il "range divisibile" al 2 ° terzo dell'array o simile. Quello avrebbe un caso peggiore log3 (n) ma godrebbe comunque di un caso migliore (log).
Andrew Gallasch,

1
@SteveJessop Ricorda che la complessità asintotica non è il quadro completo. O (log n) è molto veloce. Inoltre, la ricerca binaria fa pochissimo lavoro in ogni ciclo. Quindi già il problema per la ricerca di interpolazione è che hai bisogno di input molto lunghi per compensare il fatto che fai più lavoro su ogni ciclo. Il tuo suggerimento aggiunge più lavoro a questo. Se non fossi in grado di accettare O (n) per dati non uniformi, sospetto che la soluzione migliore sia quella di cercare una ricerca binaria pura, piuttosto che un approccio ibrido.
Taemyr,

@SteveJessop: non è necessario cambiare algoritmo; questo può essere fatto in parallelo. Dato un intervallo R, è possibile determinare il punto P1 come il solito punto medio per la ricerca binaria e P2 utilizzando l'interpolazione. Ora hai tre subrange, nessuna delle quali può essere più grande della metà della gamma originale. Controlla il valore target sia rispetto a P1 che P2 e sai in quale delle tre sotto
gamme ricorrere

17

O(loglogn)


Freddo. Ora la domanda è se posso usarlo per il codice kata, ma è il mio problema lol. Lo trovo più complicato della ricerca binaria, quindi perché no.
user6245072

L'ho scoperto una volta quando scrivevo codice per indicizzare un file di registro qualche anno fa. Ho anche scoperto che per i miei dati alternare i passaggi tra interpolazione e slice binaria era meglio di entrambe le opzioni da solo. Non sono sicuro che abbia un nome o sia un effetto noto.
Neil Slater,

@NeilSlater ha forse cercato l'interpolazione coperta?
Steve Cox,

@SteveCox: ho appena cercato quel termine e non ho trovato nulla. Ha deciso di porlo
Neil Slater

-1

Penso che la terminologia corretta sarebbe una ricerca ponderata dychotomial.

Si cerca in una matrice piatta con la successiva ricerca ponderata sulla base della presunta distribuzione piatta dei numeri in essa contenuti.

Ciò corrisponde a come una persona cercherebbe una parola in un dizionario. Ma può essere molto inefficiente se la distribuzione dei dati è irregolare.

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.