Scrivere programmi corretti

Slides:



Advertisements
Presentazioni simili
Unità G3 Algoritmi notevoli. Ordinamento Un insieme di dati {a0, a1, a2, …, an} si dice ordinato in ordine crescente se a0 a1 a2 a3 … an I dati sono generalmente.
Advertisements

Ricerca sequenziale in un array di interi
Lo strano mondo degli algoritmi di ordinamento Algoritmi.
Problema dell’Ordinamento. Problema dell’ordinamento Formulazione del problema –Si vuole ordinare una lista di elementi secondo una data proprietà P Esempio:
Script bash I file di comandi in Linux. BASH  Bourne Again Shell  Modalità interattiva o batch (file di comandi)  Ambiente di programmazione “completo”
Parte 2 Programmare in Matlab – I Sommario: Introduzione: m-file Strutture condizionali e cicli –Istruzione “if” + Operatori logici in MatlabIstruzione.
Huffman Canonico: approfondimento. Come abbiamo visto, Huffman canonico ci permette di ottenere una decompressione più veloce e con un uso più efficiente.
1 ELEMENTI DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/2012
Indici di Posizione Giulio Vidotto Raffaele Cioffi.
1 Simulazione Numerica dei Fenomeni di Trasporto Necessità di introduzione dei tensori  11  12  13  23  21  22 Vogliamo descrivere in un modo che.
© 2007 SEI-Società Editrice Internazionale, Apogeo
La rappresentazione degli algoritmi
Tutorato Elementi di Informatica 2013
Le disequazioni DEFINIZIONE DISEQUAZIONI EQUIVALENTI
Ordinamento.
Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi
9. Problemi ricorrenti: ordinamento e ricerca
Divide et Impera Quicksort Mergesort Charles Antony Richard Hoare
Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi
Unità di apprendimento 7
Le postcondizioni specificano l’output della funzione.
Approcci nella soluzione di un problema
Programmazione strutturata
Tipo di dato: array Un array è un tipo di dato usato per memorizzare una collezione di variabili dello stesso tipo. Per memorizzare una collezione di 7.
PROGRAMMAZIONE BASH – ISTRUZIONE IF
8b. Esempi di algoritmi con l’uso di array: ordinamento e ricerca
CICLO DO – WHILE LINGUAGGIO C.
Divide et Impera Quicksort Mergesort
Quick Sort: Esempio Si consideri il seguente vettore, v, di n=10 elementi: i=inf j=sup Scegliamo come pivot.
TERNE PITAGORICHE Obiettivi dell’esercitazione
iterazione o ricorsione nel pensare per OGGETTI
© 2007 SEI-Società Editrice Internazionale, Apogeo
Programmazione e Laboratorio di Programmazione
32 = 9 x2 = 9 x = 3 32 = 9 √9 = 3 L’estrazione di radice
Fondamenti di Informatica
Ricorsione 16/01/2019 package.
Programmazione e Laboratorio di Programmazione
Validazione, verifica, debugging e defensing programming
Schema generale, visita in ampiezza e profondità.
Alberi n-ary Lezioni di C.
APPUNTI SUL LINGUAGGIO C
Algoritmi e Strutture Dati
Backtracking Lezione n°13 Prof.ssa Rossella Petreschi
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Astrazione e Concretizzazione
esercizi alberi binari
comprensione e modifica di codice
* 07/16/96 Sez. 2: Ordinamento La consultazione di banche dati è sempre più cruciale in tutte le applicazioni dell’Informatica. Se vogliamo consultare.
APPUNTI SUL LINGUAGGIO C Esercizi su File e Alberi Binari
comprensione e modifica di codice
Backtracking Lezione n°17 Prof.ssa Rossella Petreschi
APPUNTI SUL LINGUAGGIO C Alberi Binari – primi esercizi
Esercizio Dato un albero binario, definiamo altezza minimale di un nodo v la minima distanza di v da una delle foglie del suo sottoalbero, definiamo invece.
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Fondamenti di Informatica
Programmazione e Laboratorio di Programmazione
APPUNTI SUL LINGUAGGIO C
Programmazione e Laboratorio di Programmazione
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Array (vettori) In linguaggio C / C++.
Ricerca 01/08/2019 package.
HeapSort Stesso approccio incrementale del selectionSort Tipo di dato
Corso di Fondamenti di Informatica
Algoritmi di ordinamento
Script su vettori Realizza uno script che chiede in input una dimensione d e crea un vettore di d numeri interi casuali. Poi calcola la somma dei due numeri.
Programmazione e Laboratorio di Programmazione
Corso di Fondamenti di Informatica
Transcript della presentazione:

Scrivere programmi corretti L’esempio della ricerca binaria o dicotomica J. Bentley, Programming Pearls, Addison Welsey.

Schema processo produzione funzione iterativa Algoritmo in pseudocodice Individuazione invariante Codifica ciclo in modo da rispettare l’invariante Prova di correttezza Testing

Il problema B è un vettore di n interi, ordinato in modo crescente cioè tale che B[i] <= B[i+1], per 0≤i<n. Se n = 0 il vettore è vuoto. Vogliamo sapere se un intero t è presente in B e, se lo è, qual’è la sua posizione. La risposta al problema è quindi un valore p (per posizione) tra 0 e n-1, se l’elemento è presente, e -1 altrimenti. L’algoritmo Inizialmente l’intervallo di ricerca dell’elemento è l’intero vettore (array). L’intervallo di ricerca è ristretto in funzione del confronto tra l’elemento cercato e quello mediano: se l’elemento cercato è più piccolo di quello confrontato la ricerca si restringe alla metà sinistra del vettore, altrimenti a quella destra. Il processo si ripete fino a che si trova l’elemento oppure l’intervallo di ricerca diventa vuoto.

x < B[m] o x = B[m] o x > B[m] 0 1 2 3 4 5 6 7 8 9 10 i j m Se x < B[m] Se x > B[m] 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10 m i j i m j

Volendo implementare l’algoritmo con un programma iterativo, conviene utilizzare un invariante per progettare correttamente il ciclo. Invariante: deveStare(i,j) come abbreviazione dell’affermazione “se t è presente nel vettore dovrà essere nell’intervallo i,j, cioè tra gli elementi B[i],…,B[j]”. pseudocodice: 1. inizializza intervallo a 0,n-1. 2. loop {invariante deveStare(intervallo)} 3. if (intervallo è vuoto) esci dal ciclo e restituisci -1 4. calcola il punto mediano dell’intervallo in m 5. usa m per restringere l’intervallo di ricerca 6. se t è trovato esci dal ciclo e restituisci la sua posizione.

Raffinamento Vediamo di implementare riga per riga il nostro pseudocodice: 1. inizializza intervallo a 0,n-1 Qui decidiamo di rappresentare l’intervallo con due indici i e j per l’inizializzazione che rispetta l’invariante è 1. i=0, j= n-1 infatti deveStare(0,n-1) è vero all’ingresso nel ciclo. il prossimo passo è raffinare la terza e la quarta riga: 3. if (intervallo è vuoto) esci dal ciclo e restituisci -1 4. calcola il punto mediano dell’intervallo in m Un intervallo così individuato è vuoto se j>i (quando i=j c’è un elemento) Quindi la riga 3 diventa: 3. if (j>i) return -1; E la quarta: 4. m= (i+j)/2

Raffinamento 1. i=0, j= n-1 {deveStare(i,j)} loop 3. if (j>i) return -1; 4. m= (i+j)/2 5. usa m per restringere l’intervallo di ricerca 6. se t è trovato esci dal ciclo e restituisci la sua posizione. Per raffinare queste due righe si deve confrontare t con B[m] e compiere delle azioni nel rispetto dell’invariante: if (B[m] == t) return m; else if (B[m] < t) [implica deveStare(m+1,j), quindi] i=m+1 ; else [qui B[m] > t implica deveStare(i,m-1), quindi] j=m-1; In conclusione, utilizzando le istruzioni di ciclo più opportune, otteniamo:

Raffinamento: fine int binarySearch(int *v, int t, unsigned int n) /* restituisce la posizione di t in un vettore ordinato v se presente, -1 altrimenti prec v!=NULL && v[i] ≤ v[i+1], 0≤i<n.*/ { int i,m,j; i=0; j = n-1; while (i<=j) {invariante :deveStare(i,j)} { m= (i+j)/2; if ( v[m] < t) i = m+1; else if (v[m] == t) return m; else /* v[m] > t*/ j = m-1; } return -1;}

Testing per la ricerca binaria: scelta dei dati a scatola nera 0 1 2 3 4 5 6 7 8 9 10 i j Dalle post condizioni ricaviamo che abbiamo n possibili output: i valori tra 0 e n-1 in caso di successo e -1 in caso di insuccesso. Poiché gli elementi sono ordinati, notiamo che il caso di insuccesso può verificarsi in n+1 modi diversi. Per ogni vettore, dividiamo l’insieme dei possibili valori cercati in sottoinsiemi equivalenti rispetto al test: gli insiemi {B[0]}, …, {B[n-1]}, ciascuno dei quali corrisponde a una ricerca con successo e gli n+1 intervalli (- ,B[0]),(B[0],B[1]),…,(B[n-2],B[n-1]), (B[n-1, ) per le ricerche con insuccesso.

Testing per la ricerca binaria: scelta dei dati a scatola trasparente Nessuna, una o due esecuzioni del ciclo, con le possibili diverse uscite, sono state già considerate, aggiungiamo il caso in cui cerchiamo un elemento presente nel vettore ma fuori dal range della ricerca. Testing per la ricerca binaria: scelta dei dati per l’organizzazione del test Non ha molta importanza quali dati contiene il vettore, possiamo organizzare il testing nel modo più semplice possibile considerando vettori di lunghezza n con n che parte da 0 fino a un valore massimo, e inizializzando il vettore con multipli di 10. Considereremo inoltre il caso in cui il vettore contiene elementi tutti diversi e quello in cui il vettore contiene elementi tutti uguali

Organizzazione del testing 1 #include … #define MAXL 100 … int main(void) {int n,i, x[MAXL]; for (n=0;n<MAXL;n++) {for (i=0;i<=n;i++) /* inizializzazione del vettore, notiamo che x contiene n+1 elementi */ x[i] = 10*i; /* ricerca sul vettore vuoto */ if (n==0) assert(binSearch(x,10,n) == -1); else {for (i=0;i<n;i++) /* la ricerca è sui primi n elementi */ {/*ricerca su tutti i presenti*/ assert( binSearch(x,10*i,n)==i ); /* ricerca sui primi n intervalli di assenza: (-∞,0), (0,10),…,((n-2)*10,(n-1)*10)*/ assert(binSearch(x,10*i-5,n)==-1); }

Organizzazione del testing 2 /* ricerca nell'ultimo intervallo: ((n-1)*10,∞)*/ assert(binSearch(x,10*n-5,n)==-1); /*ci assicuriamo che non localizzi un elemento pur presente nel vettore ma al di fuori dell'ambito della ricerca */ assert(binSearch(x,10*n,n)==-1); } /*chiude l'else */ /* facciamo le stesse verifiche su elementi tutti uguali */ for (i=0;i<n;i++) x[i] = 10; if (n==0) assert(binSearch(x,10,n) == -1); else {assert((0 <= binSearch(x,10,n)) && (binSearch(x,10,n) < n )); assert(binSearch(x,5,n)==-1); assert(binSearch(x,15,n)==-1); } } /*chiude il for */ return 0;}

Organizzazione del testing 3 /* facciamo le stesse verifiche su elementi tutti uguali */ for (i=0;i<n;i++) x[i] = 10; if (n==0) assert(binSearch(x,10,n) == -1); else assert((0 <= binSearch(x,10,n))&&(binSearch(x,10,n) < n)) ; /*ricerca di un presente */ assert(binSearch(x,5,n)==-1); /*ricerca nell'intervallo di assenza (-,10)*/ assert(binSearch(x,15,n)==-1); /*ricerca nell'intervallo di assenza (10,)*/ return 0;}