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.

Esempio

Sia V = (10, 25, 30, 40, 41, 42, 60)

Nel caso ottimo, l’elemento richiesto occupa la posizione centrale e basta un unico passo rb1
Nel caso pessimo, sono necessari 3 passi rb2
Se l’elemento non è presente si scopre dopo i 3 passi del caso pessimo. rb3p
Function Binaria(V: Vettore; N: Integer; K: Real): Integer;
Var
   INF   ,
   SUP   ,
   MEDIO : Integer;
   ANCORA: Boolean;
Begin
   INF:=1;
   SUP:=N;
   ANCORA:=True;
   While(INF <= SUP) And (ANCORA) Do
      Begin
         MEDIO:=(INF+SUP) Div 2;
         If(V[MEDIO] < K) Then
            INF:=MEDIO+1
         Else If(V[MEDIO] = K) Then
            ANCORA:=False
         Else
            SUP:=MEDIO-1;
      End;
   If(ANCORA) Then
      Binaria:=0
   Else
      Binaria:=MEDIO;
End;

Semplifico

Function Binaria(V: Vettore; N: Integer; K: Real): Integer;
Var
   INF  ,
   SUP  ,
   MEDIO: Integer;
   RISP : Integer; 
Begin
   INF:=1;
   SUP:=N;
   RISP:=0;
   While(INF <= SUP) And (RISP = 0) Do
      Begin
         MEDIO:=(INF+SUP) Div 2;
         If(V[MEDIO] < K) Then
            INF:=MEDIO+1
         Else if(V[MEDIO] = K) Then
            RISP:=MEDIO
         Else
            SUP:=MEDIO-1;
      End;
   Binaria:=RISP; 
End;

Analizziamo il codice

Function ricercaBinaria(V: Vettore; N: Integer; K: Real): Integer;
Var
   INF  ,
   SUP  ,
   MEDIO,
   RISP : Integer;
Begin
   INF :=1;
   SUP :=N;
   RISP:=0;
   While(INF <= SUP) And (RISP = 0) do
      Begin
         MEDIO:=(INF+SUP) Div 2;
         If(V[MEDIO] < K) Then
            INF:=MEDIO+1
         Else if(V[MEDIO] = K) Then
            RISP:=MEDIO
         Else
            SUP:=MEDIO-1;
      End;
   ricercaBinaria:=RISP;
End;

Utilizzando la tecnica di calcolo della complessità in tempo 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-1)
  • elemento non presente: c1+c2*m

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
  • ...
  • 2
  • 1
  • 0 ...

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

2m = n
m = log2n

quindi, nel caso pessimo

T(n) = c1+c2m = c1+c2log2n

Esempi numerici

n m
24 16 4
28 256 8
210 1.024 10
216 65.536 16
220 1.048.576 20
230 1.073.741.824 30

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