Home • ECDL • Algoritmi • Java • Basi di dati • Seconda prova • Eccetera • Cerca nel sito

Ricerca binaria

Precedente
SUPERIORE
Successiva

L'algoritmo di ricerca binaria

function Ricerca(V: Vettore; N: Integer; K: Elemento): 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
      Ricerca:=0
   else
      Ricerca:=MEDIO;
end;

Possiamo concludere, come prima, che

T(x) = c1+c2x

e trascurare i conteggi.

I calcoli per T danno

bulletVettore vuoto: ...
bulletTrovato alla posizione di mezzo (al primo passo): c1+c2
bullet...
bulletTrovato all'ultimo passo: ...
bulletNon presente: c1+c2m

Quanto vale m? La dimensione del vettore sul quale si effettua la ricerca volta per volta č

N(N-1)/2 ~ N/21
((N/2)-1)/2 ~ N/4 = N/22
... = N/8 = N/23

... = N/N = 1

Quando la potenza di 2 a denominatore raggiunge N il ciclo while() termina sicuramente, cioč quando

2m = N

quindi nel caso pessimo

T = c1+c2m = c1+c2log2N

Esempi numerici

Nm
24= 16 ~ 1014
28= 2568
210= 1.024 ~ 10310
216= 65.53616
220= 1.048.576 ~ 10620
230= 1.073.741.824 ~ 10930

Ipotizzando, pessimisticamente, che i coefficienti siano molto sfavorevoli per la ricerca binaria, per esempio

Tseq(n) = 5*n+5
Tbin(n) = 100*log2n+100

calcoliamo i tempi di attesa al variare di n

nTseq(n)Tbin(n)
165*16+5 = 85100*4+100 = 500
2565*256+5 = 1285100*8+100 = 900
1.0245*1.024+5 = 5125100*10+100 = 1.100
65.536~105100*16+100 = 1.700
1.048.576~106100*20+100 = 2.100
1.073.741.824~109100*30+100 = 3.100

Anche in questa situazione di svantaggio l'algoritmo di ricerca binaria si comporta meglio se applicato ad appena 200 elementi!

Ricerca binaria - ApPuNtIdIuNiNfOrMaTiCo

Home • ECDL • Algoritmi • Java • Basi di dati • Seconda prova • Eccetera • Cerca nel sito

Precedente
SUPERIORE
Successiva