5.3. Algoritmo di Ricerca Binaria

annuncio pubblicitario
Prof. Alberto Postiglione
5.3.
Concetti di Base su Algoritmi, Strutture Dati e Programmazione
Algoritmo di Ricerca Binaria
Per introdurre il secondo algoritmo di soluzione al problema della ricerca di una parola in una dizionario, è
utile considerare una proprietà importante del dizionario stesso. La proprietà è che tutti i nomi sono posti in
ordine alfabetico. Tale ordinamento comporta un vantaggio sostanziale perché in ogni punto dell'elenco è
sufficiente un semplice sguardo per eliminare una grande quantità di schede.
Se le parole di una dizionario sono sistemate in un qualche ordine, esistono svariati metodi di ricerca
efficiente. Quella più semplice inizia dall'esame dell'elemento centrale della tabella. Se la parola cercata, X,
precede l'elemento centrale, secondo l'ordinamento di cui sopra, l'intera seconda metà della tabella può venire
eliminata; analogamente se X segue l'elemento centrale si potrà eliminare l'intera prima metà. Lo stesso
procedimento può essere applicata anche alla parte restante della tabella, e così via, fino a che la parola X non è
stata individuata o la tabella rimanente non presenta più elementi. Ad ogni passo, il numero di elementi su cui
fare la ricerca, quindi, si riduce della metà, Un unico confronto porta pertanto ad un problema di ricerca di
dimensioni dimezzate rispetto a quello di partenza. Questa procedura è chiamata ricerca binaria.
Cerchiamo adesso di formalizzare questo procedimento. Prima di poterlo fare dobbiamo però risolvere un
paio di problemi.
Innanzitutto dobbiamo stabilire cosa fare quando la tabella presenta un numero pari di elementi. Infatti in
questo caso non c’è un (unico) elemento centrale. Una buona soluzione è quella di calcolare l’elemento centrale
come: (sin+des)/212
E poi dobbiamo stabilire qual è la condizione di terminazione in caso di insuccesso. In questo caso basta
osservare che l’elemento non è nella tabella quando l’intervallo diventa vuoto, cioè il valore centrale cade più a
sinistra del limite sinistro dell’intervallo.
Siamo adesso nelle condizioni di poter formulare il nostro algoritmo di ricerca binaria. Il Flow Chart è come
segue. L’algoritmo legge la parola da cercare e la memorizza nella variabile Parola e assume che tutte le parole
del dizionario siano già in memoria nel vettore Dizionario.
12 Le parentesi   significano “arrotonda per difetto all’intero più vicino.
Ad esempio, se sin=1 e des=10, allora (sin+des)/2 = 11/2 = 5,5 = 5
Pagina:40 – Bozza del 10/05/2010
Prof. Alberto Postiglione
Concetti di Base su Algoritmi, Strutture Dati e Programmazione
Vediamo, adesso, il programma Pascal corrispondente (legge il valore n da input - in questo esempio, per
semplicità, n≤30 - e poi legge n linee dal file di testo DIZ.TXT, ognuna contenente una parola):
program ricerca_binaria;
var
Dizionario
: array [1..30] of string;
Parola
: string;
N,i,J,K
: integer;
sin, des
: integer;
DIZ
: Text;
begin
readln (N);
assign (Diz, 'c:\Esami\Diz.txt');
reset (Diz);
for i:=1 to N do readln (Diz, Dizionario[i]);
close (Diz);
read (Parola);
sin := 1;
des := n;
J := (sin+des) div 2;
K := 1;
while (K<>0) AND (des>= sin) do
begin
if Parola = Dizionario[J]
then K := 0
else
begin
if Parola < Dizionario[J]
then des := j-1
else sin := J+1;
J := (sin+des) div 2;
end;
end;
if k <> 0
then writeln (' Il nome cercato non e'' presente')
else writeln (' Il nome cercato e'' in posizione: ',J);
end.
Pagina:41 – Bozza del 10/05/2010
Scarica