Algoritmi notevoli In linguaggio C.

Slides:



Advertisements
Presentazioni simili
C++ Di Marco Cozzani.
Advertisements

Gli Algoritmi di ordinamento
Dati strutturati A. Ferrari.
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.
Algoritmi notevoli.
Ripasso R1 Dati strutturati.
Array (vettori) In linguaggio C / C++.
1 Informatica Generale Susanna Pelagatti Ricevimento: Mercoledì ore presso Dipartimento di Informatica, Via Buonarroti,
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Il Problema dellordinamento.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Il Problema dellordinamento.
8. Problemi ricorrenti: ordinamento e ricerca Ing. Simona Colucci
PROGRAMMI DI RICERCA E ORDINAMENTO
Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati.
Corso di Informatica (Programmazione)
1 Corso di Informatica (Programmazione) Esercitazione 2 (3 dicembre 2008)
1 Corso di Informatica (Programmazione) Esercitazione 3 (5 dicembre 2008)
Algoritmi e Strutture Dati Valutazione del tempo di esecuzione degli algoritmi.
e array a più dimensioni
Ordinamento di una lista: bubble-sort
Array Un array è una collezione in sequenza di variabili del medesimo tipo Riferimento con un nome comune Nome_studente1 Nome_studente2. Nome_studenteN.
Array Struttura numerate di dati. Memorizzare molti dati In informatica cè spesso bisogno di memorizzare ed elaborare un insieme costituito da molti dati.
07/04/2003Algoritmi Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare se un elemento fa parte della sequenza oppure.
ITERAZIONE e RICORSIONE (eseguire uno stesso calcolo ripetutamente)
AN Fondam98 Sorting Ricerca in un vettore ordinato.
Problema dell’ordinamento di un array: Il metodo Bubble Sort.
Corso di informatica Athena – Periti Informatici
Esercizi La distanza di hamming tra due interi x e y si definisce come il numero di posizioni nella rappresentazione binaria di x e y aventi bit differenti.
Ricerca sequenziale in un array di interi
A LGORITMI DI ORDINAMENTO Cinzia Reverberi. COS’È UN ALGORITMO? Un algoritmo è un insieme ben ordinato di operazioni non ambigue ed effettivamente calcolabili.
Definizione di un algoritmo
ALGORITMO Un algoritmo è un procedimento che risolve un determinato problema attraverso un numero finito di passi. Un formalismo che permette di rappresentare.
Definizione di algoritmo: Un algoritmo è un procedimento che risolve un determinato problema attraverso un numero finito di passi. Un problema risolvibile.
Algoritmi e Strutture Dati
Paola Disisto, Erika Griffini, Yris Noriega.  Insieme ordinato di operazioni non ambigue ed effettivamente computabili che, quando eseguito, produce.
Lo strano mondo degli algoritmi di ordinamento Algoritmi.
Array (visita e ricerca) CORDA – Informatica A. Ferrari.
L’ordinamento per Selezione seleziona l’elemento con valore maggiore e lo scambia con il primo elemento del vettore. Tra gli N-1 elementi rimanenti viene.
Problema dell’Ordinamento. Problema dell’ordinamento Formulazione del problema –Si vuole ordinare una lista di elementi secondo una data proprietà P Esempio:
GLI ALGORITMI DI ORDINAMENTO
L’ALGORITMO Un algoritmo è un procedimento formale che risolve un determinato problema attraverso un numero finito di passi. Un problema risolvibile mediante.
I circuiti elettrici.
Il problema dello zaino
Campi di gravità e topografia: analisi con QGIS
Regole associative Gianluca Amato
Natura e origini della attuale crisi europea
ECONOMIA DELLE ISTITUZIONI FINANZIARIE
La struttura dei materiali
 π BUZZO GIACOMO D’AGOSTINO ALBERTO DE ANGELIS FEDERICA
Classificazione e Predizione
L’economia monetaria Corso di Economia delle Istituzioni Finanziarie
L’infiltrazione LM-75: 2016/2017
LA PREVENZIONE INCENDI NELLE STRUTTURE RELIGIOSE APERTE AL PUBBLICO
LE NOVITÀ DEL BILANCIO 2016 …………………………………………………………………………………………………………..
Pompe di calore a integrazione geotermica
ISTITUZIONI (regole scritte e nn scritte che governano l’interazione tra individui) → d.p. e contratti → norme sociali con appropriati Δ delle regole.
Convegno europeo sui minori
ATIPICITA’ DEL FATTORE UMANO NEL PILOTAGGIO DEI DRONI
CALENDARIO LEZIONI AGGIORNATO
RAEE è l’acronimo di Rifiuti da Apparecchiature Elettriche ed Elettroniche; ogni elettrodomestico ha un ciclo di vita terminato il quale, sia per malfunzionamento.
Ricerca e innovazione:
Il processo di analisi dei fabbisogni
Comunicazioni Assemblea nazionale TTA 1-2 dicembre 2016
Proactive Care e Proactive Care Advanced
Maria Antonietta Volonté Dipartimento di Neurologia
L’evoluzione del Diritto delle Assicurazioni Continuità o rottura con il passato? Avv. Giuseppe Ranieri Studio Legale Tributario Ranieri Comitato Esecutivo.
IL TOTALITARISMO.
Asl Vco – Direzione Generale
Nota AIFA 75 Determinazione 18 novembre 2010 (GU 29 novembre 2010, n. 279): modifiche, con riferimento alla nota AIFA 75,  alla determinazione del 4 gennaio.
Transcript della presentazione:

Algoritmi notevoli In linguaggio C

Algoritmi Ricerca (verificare la presenza di un valore in un array) Ricerca sequenziale (array non ordinato) Ricerca sequenziale (array ordinato) Ricerca binaria (array ordinato) Ordinamento (ordinare i valori all’interno di un array in modo crescente o decrescente) Stupid Sort Selection Sort Bubble Sort Merge (fondere due array ordinati in un terzo array)

Algoritmi di ricerca In generale un algoritmo di ricerca si pone come obiettivo quelli di trovare un elemento avente determinate caratteristiche all'interno di un insieme di elementi. Nel nostro caso definiremo algoritmi che verificano la presenza di un valore in un array. L’array può essere non ordinato o ordinato (ipotizziamo l’ordinamento crescente)

Ricerca sequenziale La ricerca sequenziale (o completa) consiste nella scansione sequenziale degli elementi dal primo all’ultimo e si interrompe quando il valore cercato è stato trovato, oppure quando si è sicuri che il valore non può essere presente. Ha il vantaggio di poter essere applicata anche a dati non ordinati. Negli esempi tratteremo la ricerca del valore x in un array double di nome v con n elementi con funzioni che restituiscono l’indice dell’elemento dell’array con valore x o -1 in caso di valore non trovato.

Ricerca sequenziale in C int ricercaSequenziale(double v[], int n, double x) { int i=0; while (i<n && x!=v[i]) i++; if (i>=n) return -1; return i; }

Ricerca sequenziale in array ordinato int ricercaSequenziale(double v[], int n, double x) { int i=0; while (i<n && x<v[i]) i++; if (i<n && v[i]==x) return i; return -1; }

Ricerca binaria o logaritmica L'algoritmo è simile al metodo usato per trovare una parola sul dizionario: sapendo che il vocabolario è ordinato alfabeticamente, l'idea è quella di iniziare la ricerca non dal primo elemento, ma da quello centrale, cioè a metà del dizionario. A questo punto il valore ricercato viene confrontato con il valore dell'elemento preso in esame: se corrisponde, la ricerca termina indicando che l'elemento è stato trovato; se è inferiore, la ricerca viene ripetuta sugli elementi precedenti (ovvero sulla prima metà del dizionario), scartando quelli successivi; se invece è superiore, la ricerca viene ripetuta sugli elementi successivi (ovvero sulla seconda metà del dizionario), scartando quelli precedenti; se tutti gli elementi sono stati scartati, la ricerca termina indicando che il valore non è stato trovato.

Ricerca binaria in C int ricercaBinaria(double v[], int n, double x) { int primo,ultimo,medio; primo = 0; ultimo = n-1; while(primo<=ultimo) // non tutti gli elementi sono stati scartati medio = (primo+ultimo)/2; if(v[medio]==x) return medio; // valore x trovato alla posizione medio if(v[m]<x) primo = medio+1; // scarto la prima metà else ultimo = medio-1; // scarto la seconda metà } // se il programma arriva qui l’elemento non e’ stato trovato // e sono stati scartati tutti gli elementi return -1;

Ricerca binaria ricorsiva L’algoritmo si presta ad una definizione ricorsiva. Ad ogni chiamata della funzione si verifica se l’elemento ricercato si trova al centro dell’intervallo e in tal caso la funzione termina con successo, in caso contrario si modifica l’intervallo di ricerca e si effettua una nuova chiamata della funzione. Nel caso in cui l’intervallo di ricerca sia nullo si termina la ricorsione con insuccesso.

Implementazione ricorsiva int ricercaRicorsiva(double v[], int inizio, int fine, double x) { if(inizio>fine) // terminazione con insuccesso return -1; int medio=(inizio+fine)/2; if (v[m]==x) // terminazione con successo return medio; if (v[m]>x) return ricercaRicorsiva(v,inizio,medio-1,x); else return ricercaRicorsiva(v,medio+1,fine,x); }

Confronto fra gli algoritmi In genere l’efficienza si misura in base al numero di confronti effettuati che dipende da n (lunghezza dell’array). Si individuano il caso migliore e peggiore ma in generale interessa il caso medio. Algoritmo Caso migliore Caso peggiore Caso medio Caso medio con n = 1000 Ricerca Sequenziale 1 n n / 2 500 Ricerca Binaria lg2 n 10

Algoritmi di ordinamento

Alcuni algoritmi Stupid Sort Selection Sort Bubble Sort particolarmente inefficiente, come si può intuire dal nome. Consiste nel mischiare in qualche modo gli elementi dell’array poi controllare se è ordinato e, se non lo è, ricominciare da capo. Selection Sort consiste in più scansioni dell’array: al termine della prima il primo elemento conterrà il valore minore, poi si proseguirà ordinando la parte successiva dell’array. Bubble Sort consiste nella scansione dell’array elemento per elemento, scambiando i valori dei due elementi consecutivi, quando il primo è maggiore del secondo.

Scambio di elementi Tutti gli algoritmi di ordinamento si basano sullo scambio degli elementi dell’array. In tutti gli esempi faremo riferimento nelle funzioni a un generico array di double v di lunghezza n. Per lo scambio del valore di due elementi useremo la funzione: void scambia(double *e1,double *e2) { double app; // appoggio app = *e1; *e1 = *e2; *e2 = app; }

Stupid sort L’algoritmo è probabilistico. La ragione per cui l'algoritmo arriva quasi sicuramente a una conclusione è spiegato dal teorema della scimmia instancabile: ad ogni tentativo c'è una probabilità di ottenere l'ordinamento giusto, quindi dato un numero illimitato di tentativi, infine dovrebbe avere successo. Il Bozo Sort è una variante ancora meno efficiente. Consiste nel controllare se l'array è ordinato e, se non lo è, prendere due elementi casualmente e scambiarli (indipendentemente dal fatto che lo scambio aiuti l'ordinamento o meno).

Bozo Sort in C void bozoSort(double v[], int n){ while(ordinato(v,n)!=1) mescola(v,n); } int ordinato(double v[],int n){ int i; // indice array for(i=0;i<n-1;i++) if(v[i]>v[i+1]) return 0; //non ordinato return 1; //ordinato void mescola(double v[], int n){ int i1,i2 // indici casuali i1=(rand() % n); i2=(rand() % n); scambia(&v[i1], &v[i2]);

Selection Sort L’algoritmo ricerca l’elemento minore della regione del vettore da ordinare e lo sposta all’inizio della regione stessa. Ad ogni scansione viene spostato un elemento del vettore nella posizione corretta. L’ordinamento ha termine quando la regione considerata è costituita da un solo elemento.

Un esempio Array di partenza 1 23 4 -56 65 21 32 15 0 -3 -56 23 4 1 65 21 32 15 0 -3 -56 -3 4 1 65 21 32 15 0 23 -56 -3 0 1 65 21 32 15 4 23 -56 -3 0 1 4 21 32 15 65 23 -56 -3 0 1 4 15 32 21 65 23 -56 -3 0 1 4 15 21 32 65 23 -56 -3 0 1 4 15 21 23 65 32 -56 -3 0 1 4 15 21 23 32 65 Scansione 1 Scansione 2 Scansione 3 Scansione 4 Scansione 5 Scansione 6 Scansione 7 Scansione 8 Scansione 9

Selection Sort in C (1) void selectionSort(double v[],int n) { int s; //scansioni int i; //indice array for (s = 0; s < n - 1; s++) { // n-1 scansioni (n è la dimensione dell’array) for (i = s + 1; i < n; i++) // scambio di posizione fra il primo elemento // della sequenza e un elemento con valore minore if (v[i] < v[s]) scambia(&v[i],&v[s]); } } // fine ciclo interno

Selection Sort in C (2) void selectionSort(double v[],int n) { int s; //scansioni int i; //indice array for (s = 0; s < n - 1; s++) { // n-1 scansioni (n è la dimensione dell’array) // la posizione dell’elemento minore è inizialmente // la prima della regione da analizzare int posizMin = s; for (i = s + 1; i < n; i++) // ricerca la posizione dell’elemento minore // fra quelli presenti nella regione if (v[i] < v[posizMin]) posizMin = i; } scambia(&v[s],&v[posizMin]);

Bubble Sort Consiste nella scansione dell’array elemento per elemento, scambiando i valori dei due elementi consecutivi, quando il primo è maggiore del secondo. Al termine della scansione, in genere l’array non risulta ordinato e si deve procedere a una nuova scansione e alla conseguente serie di eventuali scambi tra i valori di due elementi consecutivi. Sicuramente l’array risulta ordinato quando si sono effettuate n – 1 scansioni, se n sono gli elementi dell’array. E’ detto bubblesort (ordinamento a bolle) per analogia con le bolle d’aria nell’acqua che, essendo leggere, tendono a spostarsi verso l’alto.

Un esempio

Bubble Sort in C (1) void bubbleSort(double v[], int n){ int s,i; for(s=0;s<n-1;s++) for(i=0;i<n-1;i++) if (v[i]>v[i+1]) scambia(&v[i],&v[i+1]; }

Bubble Sort in C (2) E’ possibile migliorare l’efficienza dell’algoritmo controllando se sono stati effettuati spostamenti, in caso negativo l’array risulta già ordinato void bubbleSort(double v[], int n){ int spostamento; int s=0; int i; do { spostamento = 0; //nessuno spsostamento for(i=0;i<n-1;i++) if (v[i]>v[i+1]) spostamento = 1; //effettuato uno spostamento scambia(&v[i],&v[i+1]); } s++; } while (spostamento==1 && s<n-1);

Fusione di due array ordinati Merge Fusione di due array ordinati

Algoritmo Si parte da due array ordinati a e b per ottenere un terzo array c ordinato e contenente sia i dati presenti in a che quelli presenti in b. L’algoritmo prevede la scansione dei due array con due indici diversi trasferendo in c l’elemento con valore minore.

Passaggio 1

Passaggio 2

Passaggio 3

void merge(float a[], int na, float b[], int nb, float c[]){ int i=0,j=0,k=0; while (i<na && j<nb) { // né a né b sono «finiti» if (a[i]<b[j]) { c[k]=a[i]; // prendo elemento di a i++; } else { c[k]=b[j]; // prendo elemento di b j++; k++; } // … segue …

… segue while (i<na) { // è finito b allora copio il resto di a c[k]=a[i]; k++; i++; } while (j<nb) { // è finito a allora copio il resto di b c[k]=b[j]; j++; } // fine funzione