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