Corso di Informatica Modulo T Scorrimento-Rotazione-Ricerca Prerequisiti Programmazione elementare Conoscenza ed uso di vettori
Introduzione Lo scopo di questa Unità è approfondire il concetto di vettore esaminando alcune applicazioni notevoli che hanno rilevante importanza sia didattica che pratica. In particolare: soltanto per semplicità, supponiamo di trattare con vettori di interi; esaminiamo le operazioni di scorrimento, rotazione e ricerca. Il tipo di dato array L array rientra nella definizione di tipo di dato illustrata in precedenza Il dominio D è l insieme di tutte le sequenze ordinate caratterizzate da un nome collettivo ed un indice di posizione Le costanti di tipo array si ottengono inizializzando da programma i valori delle componenti con valori costanti Le operazioni base sul tipo array sono lettura di una componente stampa di una componente assegnazione di un valore ad una componente inizializzazione con valori costanti
Il tipo di dato array Per implementare gli algoritmi notevoli ci serviamo di: operazioni base (lettura, stampa, assegnazione e inizializzazione di una componente, viste prima) operazioni globali: LeggiV (Intero V[ ], Intero n) StampaV (Intero V[ ], Intero n) strutture di controllo Quando si realizza un applicazione sfruttando strumenti di livello più basso (o più semplice) si dice che si sviluppa una implementazione. Algoritmi notevoli Date le seguenti dichiarazioni: Intero v[max]; Intero x, pos, n; con MAX costante intera, le operazioni eseguibili sul vettore sono le seguenti (ciascuna elabora n elementi del vettore): ScorriDestra (v, n); scorrimento unitario a destra dei valori di v ScorriSinistra (v, n); scorrimento unitario a sinistra dei valori di v RuotaDestra (v, n); scorrimento unitario a destra con rientro RuotaSinistra (v, n); scorrimento a sinistra con rientro pos=ricerca (x, v, n); dà posizione pos dell elemento x in v[]
Scorrimento Le operazioni di scorrimento consistono nello spostamento di un posto (a destra o sinistra) di tutte le componenti del vettore. Ad esempio l operazione ScorriDestra (v, ) sul vettore v[ ] produce il seguente effetto (si noti la perdita del valore in ultima posizione e la duplicazione del valore in prima posizione. v[ ] - v[ ] - Algoritmi di scorrimento void ScorriDestra (Intero v[], Intero n) Intero i; Per i = n- a fai v[i] = v[i-]; Fine; void ScorriSinistra (Intero v[], Intero n) Intero i; Per i = a n- fai v[i-] = v[i]; Fine; l algoritmo che produce lo scorrimento a destra degli n elementi di un vettore v[]. l algoritmo che produce lo scorrimento a sinistra degli n elementi di un vettore v[].
Rotazione Le operazioni di Rotazione consistono nello spostamento di un posto (a destra o sinistra) di tutte le componenti del vettore con il conseguente rientro dell elemento perduto. Ad esempio l operazione RuotaDestra (v, ) sul vettore v[ ] produce il seguente effetto (si noti il rientro del valore in prima posizione) v[ ] - v[ ] - 9 Algoritmi di rotazione void RuotaDestra (Intero v[], Intero n) Intero i, x; x = v[n-]; Per i = n- a fai v[i] = v[i-]; v[] = x; Fine; void RuotaSinistra (Intero v[], Intero n) Intero i, x; x = v[]; Per i = a n- fai v[i-] = v[i]; v[n-] = x; Fine; l algoritmo che produce la rotazione a destra degli n elementi di un vettore v[]. l algoritmo che produce lo rotazione a sinistra degli n elementi di un vettore v[].
Ricerca L operazione di Ricerca all interno di un vettore di dimensione n, consiste nel trovare, se esiste, la posizione di un elemento avente valore x. Se l elemento non esiste, viene restituito -. Ci sono molte tecniche per effettuare la ricerca. Fra le più importanti abbiamo: ricerca sequenziale ricerca con il metodo della sentinella ricerca binaria Ricerca sequenziale - Tecnica L operazione di Ricerca sequenziale, detta anche ricerca ingenua, consiste nello scorrere il vettore fino al punto in cui esso termina oppure fino al punto in cui venga trovato il valore x. Ad esempio, la ricerca del valore nel vettore v[ ] avente dimensione, istanziata come Ricerca (,v,) nell esempio, darebbe in uscita il valore v[ ] - 9
Ricerca sequenziale - Algoritmo l algoritmo che effettua la ricerca sequenziale di un valore x in un vettore v[] di n Costante MAX elementi interi. Intero Ricerca (Intero x, Intero v[], Intero n) Intero i = ; Fintantochè (i < n) AND (x!= v[i]) Fai i++; Se (i = = n) Ritorna -; Altrimenti Ritorna i; Fine. Ricerca sequenziale - Utilizzo l applicazione che legge un vettore Algoritmo RicercaSequenziale vett[] di MAX elementi interi e un valore num da cercare e, tramite la funzione Ricerca (x, v, n) stabilisca Costante MAX ; se num è presente in vett[]. Intero vett[max], num, n, pos; LeggiV (vett, n); /* lettura n valori del vettore */ Leggi (num); /* numero da cercare */ pos = Ricerca (num, vett, n); Se (pos = = -) Stampa ( Non trovato ); Altrimenti Stampa ( Trovato al posto + pos); Fine.
Ricerca con sentinella - Tecnica L algoritmo: usa il vettore con un elemento in più (sentinella) in cui si pone il valore x procede come nella ricerca sequenziale, ma termina sempre con x==v[i] perché o trova il valore x (successo) oppure trova la sentinella (insuccesso). non richiede il controllo di fine vettore. Ad es. se x=, si avrebbe (v. figura superiore) che Ricerca(,v,)=, mentre sempre con lo stesso vettore (v. figura inferiore), Ricerca(,v,)=, valore non accettabile perché al di fuori delo spazio di ricerca - - 9 Sentinella Ricerca con sentinella - Algoritmo Costante MAX. Intero Ricerca (Intero x, Intero v[], Intero n) Intero i = ; v[n]=x; Fintantochè (x!= v[i]) Fai i++; Se (i = = n) Ritorna -; Altrimenti Ritorna i; Fine. l algoritmo che effettua la ricerca con sentinella di un valore x in un vettore v[] di n elementi interi Si noti che poiché questa funzione ha la stessa interfaccia della funzione di ricerca sequenziale, l applicazione che ne fa uso è identica a quella vista nell ATTIVITA precedente.
Ricerca binaria - Tecnica L operazione di Ricerca binaria, si può applicare soltanto quando gli elementi del vettore sono stati preventivamente ordinati (per es. in senso crescente). L algoritmo procede nel seguente modo. Si accede alla metà del vettore: se l elemento è trovato, la ricerca termina con successo, altrimenti, si seleziona la prima metà o la seconda metà del vettore, in base al confronto tra il valore x da cercare e il valore dell elemento centrale. Sulla metà del vettore individuata, si ripete il procedimento, fino a quando il vettore è diventato un solo elemento, che può essere quello cercato (successo) o no (insuccesso). Ricerca binaria - Tecnica In pratica: sono necessari tre indici (diciamo Inf, Sup e Centro) che consentono di selezionare, di volta in volta, la porzione di vettore (sempre minore) in cui cercare l elemento. Ad ogni passo, o aumenta Inf o diminuisce Sup e Centro individua la posizione centrale; l algoritmo suddivide ripetutamente il vettore a metà, fintantochè Inf non supera Sup e l elemento non viene trovato. Quando, continuando a dividere, lo spazio di ricerca diventa un singolo elemento del vettore (Inf > Sup), se esso corrisponde al valore cercato la ricerca termina con successo, altrimenti termina con insuccesso. 9
Ricerca binaria - Tecnica Ad esempio, se il valore cercato è si ha: Inf Inf Sup 9 Sup 9 9 Inf Sup 9 Ricerca binaria - Algoritmo elementi interi Costante MAX. int Ricerca (Intero x, Intero v[], Intero n) Intero Inf =, Sup = n-; Centro = (Inf+Sup) / ; /* posizione centrale */ Fintantochè (Inf <= Sup && x!= v[centro]) Fai Se (x < v[centro]) Sup = Centro-; Altrimenti Inf = Centro+; Centro = (Inf+Sup) / ; Fine; Se (Inf > Sup) Ritorna -; Altrimenti Fine. Ritorna centro; l algoritmo che effettua la ricerca binaria di un valore x in un vettore v[] di n Anche in questo caso questa funzione ha la stessa interfaccia delle precedenti, per cui l applicazione che ne fa uso è identica a quella vista in una ATTIVITA precedente
Argomenti Il tipo di dato array Algoritmi notevoli Scorrimento Algoritmi di scorrimento Rotazione Algoritmi di rotazione Ricerca Ricerca sequenziale Tecnica Algoritmo Utilizzo Ricerca con sentinella Tecnica Algoritmo Ricerca binaria Tecnica Algoritmo Altre fonti di informazione P.Gallo, F.Salerno Informatica Generale, ed. Minerva Italica G.Callegarin Corso di Informatica, ed. CEDAM