Ricerca binaria

La ricerca binaria si applica agli array ordinati.

Essa controlla se l’elemento richiesto si trova nella posizione centrale dell’array altrimenti concentra la ricerca nella parte

  • BASSA se ha trovato un elemento MAGGIORE
  • ALTA se ha trovato un elemento MINORE

e continua finché

  • non trova l’elemento,
  • oppure rimane da esaminare un sottoarray vuoto.
rb1Nel caso ottimo
l’elemento richiesto occupa la posizione centrale,
basta un unico passo.
rb2Nel caso pessimo
sono necessari 3 passi.
rb3pSe l’elemento non è presente…
si scopre dopo i 3 passi del caso pessimo.

Riepilogo posizione -> passi

Complessità dell’algoritmo

Analizziamo il codice (Pascal)

Utilizzando la tecnica di calcolo della complessità in tempo utilizzata per la ricerca sequenziale possiamo concludere che T(x)=c1+c2x con x il numero di volte che viene eseguito il ciclo.

I calcoli approssimati per T danno

  • vettore vuoto: ~7
  • elemento trovato al 1° passo (in mezzo): c1+c2*1
  • elemento trovato al 2° passo: c1+c2*2
  • elemento trovato all’ultimo passo: c1+c2*m
  • elemento non presente: c1+c2*(m+1)

Supponiamo pessimisticamente di dover aspettare sempre fino all’ultimo passo, allora T(n)=c1+c2*m.

Quanto vale m?

La dimensione del vettore sul quale si effettua la ricerca passo-passo è

n > ~n/2 > ~n/4 > ~n/8 > … > n/2m > … > 2 > 1 > 0

Quando il valore della potenza di 2 a denominatore raggiunge n il ciclo termina sicuramente, cioè per

  • 2m = n
  • m = log2 n

quindi, nel caso pessimo T(n) = c1 + c2 m = c1 + c2 log2 n

Esempi numerici

nmT(n)
16= 244c1+c2·4
256= 288c1+c2·8
1.024= 21010c1+c2·10
65.536= 21616c1+c2·16
1.048.576= 22020c1+c2·20
1.073.741.824= 23030c1+c2·30

L’algoritmo di ricerca binaria applicato a un vettore con un miliardo di elementi garantisce una risposta dopo appena 30 passi!