8b. Esempi di algoritmi con l’uso di array: ordinamento e ricerca

Slides:



Advertisements
Presentazioni simili
Algoritmi notevoli.
Advertisements

Algoritmi notevoli In linguaggio C.
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.
RICERCA IN UN VETTORE.
RICERCA IN UN VETTORE. Metodi basati sul confronto di chiavi Si confrontano gli elementi del vettore V con lelemento (chiave K) che si vuole ricercare.
8. Problemi ricorrenti: ordinamento e ricerca Ing. Simona Colucci
Problema dell’Ordinamento. Problema dell’ordinamento Formulazione del problema –Si vuole ordinare una lista di elementi secondo una data proprietà P Esempio:
8. Problemi ricorrenti: ordinamento e ricerca Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
2a + 10b abx2 3a + 1 y 2 a + 1 x + 2y a − Espressioni algebriche
Prof.ssa Rossella Petreschi Lezione del 5/12/2012 del Corso di Algoritmi e Strutture Dati Riferimenti: Capitolo 11 del testo Anany Levitin “The design.
Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica FONDAMENTI DI INFORMATICA Domenico Talia
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.
Indici di Posizione Giulio Vidotto Raffaele Cioffi.
INFORMATICA ALGORITMI, PROGRAMMI, E LINGUAGGI DI PROGRAMMAZIONE.
.  I tipi di dati non primitivi sono gli array, le struct e le union.  Gli array sono degli aggregati di variabili dello stesso tipo.  La dichiarazione.
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
© 2007 SEI-Società Editrice Internazionale, Apogeo
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
Giovanni Finaldi Russo Pietro Bruno
Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi
Progettare algoritmi veloci usando strutture dati efficienti
Misure dei valori centrali
Algoritmi Avanzati a.a.2015/2016 Prof.ssa Rossella Petreschi
MASSIMO COMUNE DENOMINATORE (M.C.D)
7. Strutture di controllo Ing. Simona Colucci
Ordinamento.
Algoritmi Avanzati a.a.2010/2011 Prof.ssa Rossella Petreschi
(7x + 8x2 + 2) : (2x + 3) 8x2 + 7x + 2 2x + 3 8x2 + 7x + 2 2x + 3 4x
La funzione Path e le forme a cespuglio
IL CONCETTO DI ALGORITMO
9. Problemi ricorrenti: ordinamento e ricerca
Divide et Impera Quicksort Mergesort Charles Antony Richard Hoare
Cluster Analysis Definizione di Classificazione: operazione concettuale condotta adottando un solo criterio (detto fondamento della divisione) per individuare.
7. Strutture di controllo
B-alberi e alberi autoaggiustanti
Organizzazione fisica
Programmazione strutturata
Sulla complessità Lezione n°2
Algoritmi Avanzati Prof.ssa Rossella Petreschi
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.
Informatica per l’Ingegneria
Algoritmi e Strutture Dati
Divide et Impera Quicksort Mergesort
I MONOMI.
Quick Sort: Esempio Si consideri il seguente vettore, v, di n=10 elementi: i=inf j=sup Scegliamo come pivot.
© 2007 SEI-Società Editrice Internazionale, Apogeo
Strutture di Controllo
{ } Multipli di un numero M4 ESEMPIO 0, 4, 8, 12, 16, 20, 24, …
32 = 9 x2 = 9 x = 3 32 = 9 √9 = 3 L’estrazione di radice
Lezione n°6 Prof.ssa Rossella Petreschi
Scrivere programmi corretti
© 2007 SEI-Società Editrice Internazionale, Apogeo
Esercitazione su Instruction Level Parallelism
Algoritmi e Strutture Dati
Backtracking Lezione n°13 Prof.ssa Rossella Petreschi
* 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 Implementazioni di Liste Concatenate
APPUNTI SUL LINGUAGGIO C Esercizi sugli array e strutture
Backtracking Lezione n°17 Prof.ssa Rossella Petreschi
Processi decisionali e funzioni di controllo
MergeSort Usa la tecnica del divide et impera:
Lezione Terza Primi passi di programmazione
Informatica CdL Scienze e Tecniche Psicologiche a.a
Ricerca 01/08/2019 package.
La programmazione strutturata
Algoritmi.
Corso di Fondamenti di Informatica
Algoritmi di ordinamento
Transcript della presentazione:

8b. Esempi di algoritmi con l’uso di array: ordinamento e ricerca Informatica per l’Ingegneria

Informatica per l’Ingegneria Indice Problemi ricorrenti in informatica: Ordinamento di un vettore: Ordinamento per selezione: il metodo di selezione diretta (selection sort) Ordinamento per scambio: il metodo dell’affioramento(bubble sort) Il metodo dell’ordinamento non decrescente(quick sort) Ordinamento per fusione (merge-sort) Ricerca in un vettore: Ricerca sequenziale Ricerca dicotomica Informatica per l’Ingegneria

Il problema dell’ordinamento Il problema è quello di ordinare gli elementi di un insieme secondo una prefissata relazione d’ordine, che dipende dalla natura dei dati da ordinare I metodi di ordinamento si applicano ad insiemi di dati elementari (singoli numeri o lettere) dati rappresentati in forma complessa: in generale si fa riferimento ad un insieme di strutture, delle quali si seleziona un campo che viene usato come campo chiave per l’ordinamento; il risultato dell’ordinamento sarà una ridisposizione dei record secondo l’ordinamento introdotto nel campo considerato. Informatica per l’Ingegneria

Informatica per l’Ingegneria Metodi di ordinamento Classificazione: Inserzione: Si considerano gli elementi uno alla volta e ciascun nuovo elemento viene collocato nella posizione che gli compete all’interno dell’insieme di elementi considerati in precedenza. Selezione: Si scandisce l’insieme in modo da individuare l’elemento più piccolo, che viene separato dal resto dell’insieme. Dell’insieme rimasto viene ancora trovato il più piccolo elemento e lo si colloca di seguito a quello trovato in precedenza. Questo procedimento si itera fino a quando non si sono considerati tutti gli elementi. Scambio: Si scandisce tutto l’insieme, se due elementi vengono trovati fuori posto si scambiano tra loro. Questo procedimento viene ripetuto fino a quando non si hanno più cambiamenti. Fusione: Si sfrutta un’operazione più semplice dell’ordinamento, chiamata fusione, che consiste nel formare un insieme ordinato a partire da due insiemi già ordinati Informatica per l’Ingegneria

Prestazioni degli algoritmi di ordinamento Misurate tramite due fattori: Numero di confronti necessari per determinare gli elementi fuori posto Numero di spostamenti da effettuare per riportare gli elementi al loro posto Algoritmi con valore basso per i due fattori sopra esposti sono più efficienti: eseguono l’ordinamento in meno passaggi, cioè impiegando meno tempo e spazio Informatica per l’Ingegneria

Informatica per l’Ingegneria Ipotesi di lavoro Nel seguito: come insieme di dati da ordinare considereremo un vettore di numeri interi V di dimensione N; V(i) indicherà l’i-esimo elemento del vettore. La relazione d’ordine che si prenderà in considerazione è l’usuale ordinamento numerico (basato sui concetti di minore e maggiore) Supporremo di realizzare un ordinamento crescente. Con l’istruzione V(i) V(k) abbrevieremo il seguente blocco di istruzioni di scambio: lavoro = V(i); V(i) = V(k); V(k)= lavoro; Informatica per l’Ingegneria

Ordinamento per selezione Selection Sort : Il metodo di selezione diretta: Il metodo fa uso di due indici di posizione : i: è l’indice dell’elemento del vettore che delimita l’inizio dell’insieme dei valori presi in considerazione ad ogni singolo passo j: è un cursore che ad ogni passo percorre l’insieme dei valori da scandire k: è un indice che all’interno di ogni passo tiene traccia del minimo progressivo dell’insieme da scandire Informatica per l’Ingegneria

Ordinamento per selezione Algoritmo di selezione diretta: Passo 0: All’inizio l’indice i viene posizionato sul primo elemento del vettore V; j invece comincia a scandire dal secondo elemento Passo 1: Il primo elemento viene confrontato con i rimanenti (scanditi da j), scambiando di posto il primo elemento e quello di valore minimo alla fine della scansione(posizione k) Passo 2: Al secondo passo l’indice i viene portato alla seconda posizione, perché il nuovo insieme dei valori da scandire non comprende il primo, che è sicuramente il minimo Passi successivi: L’indice j percorre l’insieme dei valori da scandire, a partire dall’elemento successivo a i; il processo riprende in maniera analoga al passo precedente e viene iterato finché l’indice i non giunge all’ultima posizione. Informatica per l’Ingegneria

Informatica per l’Ingegneria Esempio 25 8 37 41 27 le colonne rappresentano i passi dell’algoritmo gli elementi evidenziati in azzurro rappresentano il sottoinsieme del vettore da scandire per l’ordinamento ad ogni passo il cerchio rosso rappresenta l’elemento minimo di ognuno dei sottoinsiemi Informatica per l’Ingegneria

Prestazioni dell’algoritmo Il metodo di selezione diretta presenta un numero di confronti proporzionale ad N2: al primo passaggio si effettuano N-1 confronti, al secondo N-2 e così via, fino ad arrivare all’ultimo confronto; si ha pertanto: (N-1) + (N-2) + (N-3) + ….. +1 = N(N-1)/2 Per quanto riguarda il numero di spostamenti essi sono al più N-1. La prestazione del metodo per quanto riguarda il numero di confronti non è influenzata dalla configurazione iniziale dei dati(se sono ordinati o meno) Informatica per l’Ingegneria

Selezione diretta: flow-chart inizio i =1 Le istruzioni di scambio si trovano nel ciclo scandito dalla i, per cui vengono eseguite N-1 volte AL PIU’ (solo se K!=i) I confronti vengono effettuati N-1 volte per ognuno degli N cicli scanditi dalla i, perché si trovano in un’istruzione di controllo all’interno dei due cicli falso i<N vero k = i j = i+1 falso j<=N vero V(k)>V(j) vero k = j falso j=j+1 fine vero k != i V(i) V(k) falso i=i+1 Informatica per l’Ingegneria

Informatica per l’Ingegneria Codice Sorgente N=input('Inserire la dimensione del vettore'); for i=1:N V(i)=input('Inserire un numero'); end k=i; for j=i+1:N if V(k) >V(j) k=j; if k~=i lavoro = V(i); V(i) = V(k); V(k)= lavoro; disp(V); Informatica per l’Ingegneria

Ordinamento per scambio Il procedimento tipico di qualsiasi algoritmo di scambio è il seguente: si considerano i primi due elementi dell’insieme; se il primo elemento della coppia è maggiore del secondo i due elementi vengono scambiati di posto tra di loro; si considera ora una nuova coppia formata dal secondo e dal terzo elemento dell’insieme, si confrontano e si scambiano le posizioni se necessario; questo procedimento si ripete, considerando coppie di elementi consecutivi, fino a quando non si è esaurito tutto l’insieme Informatica per l’Ingegneria

Ordinamento per scambio Il metodo dell’affioramento (Bubble Sort) Gli elementi più “pesanti” tendono ad andare verso il basso e quelli più leggeri verso l’alto: ad ogni passo (step) dell’algoritmo l’elemento in assoluto più pesante sarà collocato nella posizione finale, che al passo successivo non verrà più scandita Il numero massimo di passi è N-1 , ma dato che ad ogni passo più elementi potrebbero essere “a posto”, i passi potrebbero anche di meno Informatica per l’Ingegneria

Informatica per l’Ingegneria Esempio 25 8 37 27 41 le colonne rappresentano i passi dell’algoritmo gli elementi evidenziati in azzurro rappresentano il sottoinsieme del vettore da scandire per l’ordinamento ad ogni passo il cerchio rosso rappresenta l’elemento massimo di ognuno dei sottoinsiemi Informatica per l’Ingegneria

Bubble Sort: Flow-chart inizio La variabile più importante usata nel procedimento è: scambi: viene inizializzata a 0 ad ogni passo e serve per controllare se ci sono stati scambi ad un certo passo: se non ce ne sono il resto di vettore è ordinato step = 1, scambi=1 falso step < N && scambi == 1 vero scambi = 0 fine j = 1 falso j <= N - step vero vero V(j)>V(j+1) V(j) V(j+1) scambi = 1 falso j = j + 1 step = step + 1 Informatica per l’Ingegneria

Informatica per l’Ingegneria Codice Sorgente N=input('Inserire la dimensione del vettore'); for i=1:N V(i)=input('Inserire un numero'); end step=1; scambi=1; while step<N && scambi==1 scambi=0; for j=1:N-step if V(j)>V(j+1) lavoro = V(j); V(j) = V(j+1); V(j+1)= lavoro; step=step+1; disp(V); Informatica per l’Ingegneria

Informatica per l’Ingegneria Prestazioni Numero di confronti: l’analisi del caso peggiore porta a concludere che il metodo è di ordine N2 ; il caso peggiore si ha quando l’insieme è ordinato in modo decrescente e da vita ad un numero complessivo di confronti pari a (N-1) + (N-2) + (N-3) + ….. +1 = N(N-1)/2 Si può dimostrare che questa valutazione è vera anche nella media dei casi Nel caso in cui in qualche passo vada a posto più di un elemento il numero di confronti complessivi da operare sarà inferiore Numero di spostamenti: Si segue un ragionamento analogo (nel caso peggiore sono N(N-1)/2). La prestazione del metodo è pertanto influenzata dalla configurazione iniziale dei dati Informatica per l’Ingegneria

Il problema della ricerca Il problema è quello di cercare un elemento in un vettore I metodi di ricerca si applicano ad insiemi di dati elementari (singoli numeri o lettere) dati rappresentati in forma complessa: in generale si fa riferimento ad un insieme di record, dei quali si cercano uno o più campi che vengono usati come campi chiave per la ricerca. Informatica per l’Ingegneria

Informatica per l’Ingegneria Metodi di ricerca Metodi basati sul confronto di chiavi: si confrontano gli elementi del vettore con l’elemento (chiave) che si vuole ricercare: Ricerca lineare: si confronta ripetutamente la chiave con ciascuno degli elementi del vettore finché eventualmente non si trova la chiave Ricerca dicotomica: Si confronta la chiave con l’elemento che si trova a metà del vettore (supposto ordinato). Se l’elemento individuato non è uguale a quello cercato si prosegue la ricerca nel semivettore inferiore o superiore a seconda che la chiave sia più piccola o più grande dell’elemento che si trova a metà. Informatica per l’Ingegneria

Informatica per l’Ingegneria Ipotesi di lavoro Elementi utilizzati nell’analisi: Vettore V di dimensione N Chiave di ricerca K Indice i per scorrere il vettore t = indice che punta all’inizio del vettore in cui ricercare u= indice che punta alla fine del vettore in cui ricercare Informatica per l’Ingegneria

Informatica per l’Ingegneria Ricerca lineare Principio risolutivo: Si confronta ripetutamente la chiave K con ciascuno degli elementi del vettore finché non si trova V(i) = K (ricerca con successo) oppure finché non sono stati considerati tutti gli elementi del vettore senza trovarne nessuno uguale a K (ricerca senza successo). Informatica per l’Ingegneria

Ricerca lineare: flow-chart start i = 1 K ≠ V (i) and i <= N no si i = i+1 no si i <=N Elemento Non trovato Elemento Trovato con indice i end Informatica per l’Ingegneria

Informatica per l’Ingegneria Codice Sorgente N=input('Inserire la dimensione del vettore'); for i=1:N V(i)=input('Inserire un numero'); end K=input('Inserire elemento da cercare'); i=1; while i<=N&& K~=V(i) i=i+1; if i<=N fprintf('Elemento trovato con indice %d\n',i); else disp('Elemento non trovato'); Informatica per l’Ingegneria

RICERCA LINEARE: Numero Confronti Due valutazioni diverse a seconda dell’esito della ricerca: ricerca con successo: si fa riferimento al numero medio di confronti, che si ottiene dividendo il numero totale di confronti necessari per ricercare tutti gli elementi per il numero degli elementi stessi. Siccome per individuare il primo elemento si effettua un confronto, per il secondo due e così via, il numero totale di confronti è : 1+2+3+4+5+….. N = N (N+1)/2 Il numero medio di confronti risulta (N+1)/2 ricerca senza successo: l’algoritmo esamina sempre tutto il vettore, quindi il numero di confronti è sempre N Informatica per l’Ingegneria

Ricerca in vettori ordinati Vantaggio: Il numero di confronti in caso di ricerca senza successo è lo stesso che nella ricerca con successo (N+1)/2, perché si procede alla scansione del vettore finché K ≤ V(i). A questo punto o K= V(i), e la ricerca è con successo, oppure si possono interrompere i confronti, e la ricerca risulta senza successo. Pertanto si determina il numero medio di confronti come in caso di successo Informatica per l’Ingegneria

RICERCA BINARIA (detta dicotomica o logaritmica) Si applica su vettori ordinati Si confronta la chiave K con l’elemento che si trova a metà del vettore. Se l’elemento individuato non è uguale a quello cercato si prosegue la ricerca nel semivettore inferiore o superiore a seconda che la chiave K sia più piccola o più grande dell’elemento che si trova a metà. Il procedimento continua iterativamente in modo da suddividere le sottotabelle via via individuate. La ricerca termina con successo quando l’elemento V(i) considerato ad un certo passo è proprio uguale a K. La ricerca termina con insuccesso quando la parte di vettore considerata è costituita da un solo elemento. Informatica per l’Ingegneria

Ricerca dicotomica: flow-chart start t = 1 u = N i = ceil((t+u)/2) no t <= u && K ~=V (i) si no K > V (i) si u = i - 1 t = i + 1 i = ceil((t+u)/2) t>u no si Elemento trovato posizione i Elemento Non trovato end Informatica per l’Ingegneria

Ricerca dicotomica: codice Versione iterativa //Ricerca dicotomica di una chiave K in un vettore V N=input('Inserire la dimensione del vettore'); for i=1:N V(i)=input('Inserire un numero'); end %Ordinamento k=i; for j=i+1:N if V(k) >V(j) k=j; if k~=i lavoro = V(i); V(i) = V(k); V(k)= lavoro; disp (V); %Ricerca K=input('Inserire elemento da cercare'); t=1; u=N; i=ceil((t+u)/2); while t<=u && K~=V(i) if K>V(i) t=i+1; else u=i-1; end if t>u disp('Elemento non trovato'); else fprintf('Elemento trovato in posizione%d\n',i); Informatica per l’Ingegneria

RICERCA DICOTOMICA: Numero Confronti L’algoritmo è il più veloce tra quelli di ricerca basati sul confronto di chiavi. In un vettore di dimensione N = 2h -1 l’algoritmo deve compiere h=log2(N+1) passi(e quindi confronti) per la ricerca senza successo, mentre i confronti possono essere di meno per la ricerca con successo. Informatica per l’Ingegneria