Capitolo 5. Ricerca di una parola in un Dizionario

Transcript

Capitolo 5. Ricerca di una parola in un Dizionario
Prof. Alberto Postiglione
Concetti di Base su Algoritmi, Strutture Dati e Programmazione
Capitolo 5. Ricerca di una parola in un
Dizionario
5.1.
Definizione del problema
Consideriamo adesso un problema che ammette più algoritmi: la ricerca di un'informazione in una tabella.
Tale problema consiste nel determinare se una parola X è presente in una lista di parole. La parola X può
essere il nome di una persona, il titolo di un libro, il numero di una carta di credito, o altro. Il problema è
equivalente a quello della ricerca di una parola in un dizionario.
Supponiamo che N differenti parole siano immagazzinate in N celle di memoria contigue all’interno di un
elaboratore. Si deve costruire un algoritmo che prenda in input la parola X e dia in output la posizione J in cui
appare X. Pertanto, se X è presente l'uscita sarà un numero compreso tra 1 ed N; se invece X non si trova in
memoria il risultato sarà 0.
5.2.
Algoritmo di Ricerca Sequenziale
L'algoritmo più semplice consiste nel collocare le N parole nelle celle di memoria da 1 ad N ed esaminare a
turno ogni parola, a partire dall’ultima tornando indietro verso la prima. Se X si trova nella cella J l’algoritmo
fornisce in uscita J per poi fermarsi; ma se vengono esaurite tutte le N possibilità senza alcun esito, si ferma con
0 in uscita. Vediamo il Flow Chart che rappresenta questo algoritmo
NOTA: 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 nell’array Dizionario
START
Leggi Parola
J
K
N
1
K <>0 AND J<>0
SI
NO
NO
J
Parola =
Dizionario[J]
J- 1
Stampa J
STOP
Pagina:38 – Bozza del 10/05/2010
SI
K
0
Prof. Alberto Postiglione
Concetti di Base su Algoritmi, Strutture Dati e Programmazione
Il codice inizializza le variabili J e K e poi comincia il ciclo. Alla fine la variabile J conterrà la posizione di
Parola nel vettore Dizionario oppure 0.
La variabile K non fa parte della computazione, ma serve per poter determinare se il corpo del ciclo va
eseguito o se bisogna uscire da esso in caso di presenza di Parola nel vettore Dizionario. Infatti si esce dal ciclo
se J=0 (non c’è Parola in Dizionario) oppure se K=0 e K diventa 0 solo quando Parola=Dizionario[J] cioè
quando è stata individuata la parola nel vettore (in linea di principio avremmo potuto inizializzare K con
qualsiasi altro valore diverso dallo 0).
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_sequenziale;
var
Dizionario
: array [1..30] of string;
Parola
: string;
N, i,J,K
: integer;
DIZ
: Text;
Begin
Readln (N);
assign (Diz, 'c:\Esami\Diz.txt');
reset (Diz);
for i:=1 to 30 do readln (Diz, Dizionario[i]);
close (Diz);
read (Parola);
J := N;
K := 1;
while (K<>0) AND (J<>0) do
begin
if Parola = Dizionario[J] then K := 0 else J:=J-1;
end;
writeln (J)
end.
Questo algoritmo risolve sicuramente il problema, ma la soluzione non ci sembra, in verità, molto efficiente.
Infatti, quando il numero di parole diventa grande, diciamo 1.000.000 la ricerca sequenziale, che è il nome
dell’algoritmo appena dato, richiede, nel caso peggiore, un numero molto grande di passi computazionali che,
per il nostro esempio, è pari proprio a 1.000.000.
Tale algoritmo equivale alla ricerca di un numero telefonico fatta consultando un elenco degli abbonati pagina
per pagina, a partire dalla prima pagina, colonna per colonna, una riga alla volta. Sicuramente non è un metodo
che noi saremmo disposti a seguire, ma anche il calcolatore può essere utilizzato in modo più efficiente.
Pagina:39 – Bozza del 10/05/2010