UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Algoritmi e Strutture Dati Prof. Michele Amoretti Fondamenti di Informatica a.a. 2007/2008 Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Sommario • Definizione di algoritmo • Attributi degli algoritmi • Costo computazionale • Descrizione degli algoritmi • Tecniche di progettazione di algoritmi • Strutture dati • Algoritmi di ordinamento Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Definizione di algoritmo Algoritmo: un insieme ordinato di operazioni non ambigue ed effettivamente computabili che, quando eseguito, produce un risultato e si arresta in un tempo finito. In termini informali, un algoritmo è una sequenza ordinata di operazioni che risolve un problema specifico. Se questa idea aveva una certa importanza per il calcolo matematico, l'avvento dell'informatica l'ha arricchita di nuovi significati.. Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Definizione di algoritmo .. tanto che, con molta enfasi, è stata data anche la seguente definizione di informatica: L’informatica è lo studio degli algoritmi, che comprende: 1. 2. 3. 4. le le le le loro loro loro loro proprietà formali e matematiche; implementazioni hardware; implementazioni linguistiche; applicazioni. Gibbs, N. E., e Tucker, A. B. “A Model Curriculum for a Liberal Arts Degree in Computer Science”, Comm. of the ACM, vol. 29, n. 3 (marzo 1986). Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Definizione di algoritmo L’opposto di algoritmo: euristica. Si definisce infatti procedimento euristico un metodo di approccio alla soluzione dei problemi che non segue un chiaro percorso, ma si affida all'intuito e allo stato temporaneo delle circostanze, al fine di generare nuova conoscenza. Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Definizione di algoritmo Tutte le operazioni utilizzate per realizzare algoritmi rientrano in una delle seguenti tre categorie: • Operazioni sequenziali • Operazioni condizionali • Operazioni iterative Un’istruzione sequenziale esegue una singola attività ben definita. Terminata l’attività, l’algoritmo passa all’operazione successiva. Solitamente le operazioni sequenziali sono espresse come semplici frasi dichiarative. Si tratta delle istruzioni di un algoritmo che “pongono una domanda”. L’operazione successiva è selezionata sulla base della risposta fornita alla domanda. Si tratta delle istruzioni “di ciclo” di un algoritmo. Indicano di non proseguire con l’istruzione successiva, ma di tornare indietro e ripetere l’esecuzione di un precedente blocco di istruzioni. Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Definizione di algoritmo Un algoritmo deve essere: - non ambiguo (i risultati non devono variare in funzione della macchina o persona che esegue l'algoritmo) - corretto (deve risolvere un dato problema) - realizzabile (deve essere eseguibile con le risorse a disposizione) - finito (deve essere composto da un numero finito di passi elementari; le operazioni sono eseguite un numero finito di volte) - efficiente (deve avere un costo accettabile, se non ottimo, in termini di risorse consumate: tempo di CPU richiesto per completare, quantità di memoria utilizzata, quantità di bit trasferiti) Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Attributi degli algoritmi • Correttezza • Facilità di comprensione • Eleganza • Efficienza Talvolta eleganza e facilità di comprensione vanno in direzioni contrarie: più elegante è la soluzione, più difficile risulta da capire. Es. somma dei primi N interi (algoritmo di Gauss) Conviene scambiare la facilità di comprensione per l’eleganza? Naturalmente l’ideale è un algoritmo elegante e facile da comprendere al tempo stesso. Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Attributi degli algoritmi Efficienza è il termine usato per descrivere l’uso attento delle risorse da parte di un algoritmo. Come si misurano il tempo e lo spazio consumati da un algoritmo, in modo da determinare se è efficiente? L’efficienza rispetto allo spazio si può giudicare in base alla quantità di informazioni che l’algoritmo deve registrare nella memoria del computer per svolgere il proprio compito, oltre ai dati iniziali sui quali opera. L’efficienza rispetto al tempo di un algoritmo è un’indicazione della quantità di “lavoro” richiesto dall’algoritmo stesso. È una misura dell’efficienza implicita del metodo, indipendente dalla velocità della macchina su cui è eseguito, dai valori dei dati di ingresso elaborati ma non dalla loro quantità. Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Attributi degli algoritmi La quantità di lavoro di un algoritmo coincide con il numero di istruzioni eseguite? Non tutte le istruzioni si equivalgono, perciò forse non vanno “contate” tutte allo stesso modo. Alcune istruzioni sono fondamentali per il modo in cui l’algoritmo opera, mentre altre svolgono attività periferiche in supporto dell’opera principale. Per misurare l’efficienza rispetto al tempo, identifichiamo le unità di lavoro fondamentali dell’algoritmo e contiamo quante volte sono eseguite. Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Attributi degli algoritmi Sia N la dimensione dei dati da elaborare. Tempo di esecuzione logN Tipologia di algoritmo Risolvono grossi problemi riducendone la dimensione di un fattore costante. N Eseguono poche operazioni su ciascun elemento dell’input. NlogN Suddividono il problema in sottoproblemi più piccolo che vengono risolti indipendentemente. N2 Elaborano gli elementi dell’input a coppie (probabilmente all’interno di due cicli nidificati). 2N Risolvono alcuni problemi di interesse pratico per i quali non si conoscono ancora algoritmi non esponenziali. N3 Elaborano terne di valori (probabilmente all’interno di tre cicli nidificati). Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Complessità computazionale La notazione O(·) Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Complessità computazionale La notazione Ω(·) Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Complessità computazionale La notazione Θ(·) Gli algoritmi si classificano spesso in base all’ordine di grandezza Θ() della loro efficienza rispetto al tempo. Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Descrizione di algoritmi Il linguaggio di descrizione di un algoritmo deve essere adeguato alle caratteristiche del suo esecutore. • esecutore umano: - linguaggio naturale (eventualmente strutturato) - linguaggio grafico (es. diagrammi di flusso) • calcolatore (esecutore automatico): - linguaggio di programmazione (programma = specifica di una computazione) Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Descrizione di algoritmi La macchina di Turing è un modello astratto di generico sistema risolutore di problemi (non necessariamente un calcolatore elettronico). Le istruzioni della MT sono quindi un modello di algoritmo, infatti: - non vi è mai confusione su cosa la MT deve fare ad ogni passo, né sulla successiva istruzione da eseguire (non ambiguità) - la MT esegue le istruzioni e restituisce un risultato sul nastro di uscita (correttezza) - le istruzioni comportano l’uso delle risorse a disposizione, i k nastri, e di nient’altro (realizzabilità) Le altre caratteristiche (finitezza ed efficienza) non dipendono da come è fatta la MT, ma da come le istruzioni sono concepite, e dai dati in ingresso. Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Pseudocodice Utilizzare un insieme di istruzioni per MT per descrivere un algoritmo non è certamente agevole. Molti studiosi di informatica utilizzano una notazione denominata pseudocodice per progettare e rappresentare gli algoritmi. Si tratta di costrutti in simil-linguaggio naturale studiati per assomigliare alle istruzioni di un linguaggio di programmazione, ma che in realtà non si eseguono su un computer. Lo pseudocodice rappresenta un compromesso tra i due estremi del linguaggio naturale e di quello formale; è semplice, altamente leggibile e praticamente privo di regole grammaticali. Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Pseudocodice Esempio moltiplicazione per somme Problema: dati due numeri interi a e b maggiori o uguali a 0, determinarne il prodotto p. 1. 2. 3. 4. 5. 6. p0 se b=0 vai all’istruzione 6 p p+a b b-1 vai all’istruzione 2 fine Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Pseudocodice ATTENZIONE! Il fatto che il numero di istruzioni presenti nella descrizione di un algoritmo sia finito non implica necessariamente che l’algoritmo termini in un tempo finito! 1. 2. 3. 4. r0 r r+1 vai all’istruzione 2 fine Manca la condizione di uscita dal ciclo! Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Diagrammi di flusso Un diagramma di flusso (flow chart) è la rappresentazione grafica dei passi che costituiscono un algoritmo. E’ uno strumento efficace per la descrizione degli algoritmi. I diagrammi di flusso usano forme geometriche diverse per rappresentare: trasferimento di informazioni (lettura dati, scrittura risultati, visualizzazione dati intermedi) esecuzione di calcoli assunzione di decisioni esecuzione di iterazioni (ripetizione di sequenze di operazioni) Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Diagrammi di flusso Simboli convenzionali: Elaborazione – I blocchi rettangolari possono rappresentare istruzioni di assegnamento o più in generale istruzioni che comportano una qualche modifica dello stato globale della computazione. Decisione – I blocchi a forma di rombo vengono utilizzati per rappresentare istruzioni di salto condizionato. Inizio/fine – I blocchi ovali vengono utilizzati per rappresentare l’inizio e la fine dell’algoritmo. Algoritmi e Strutture Dati vE B i1,i2,..,in o1,o2,..,on Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Diagrammi di flusso Strutture per il flusso di controllo: While-Do I O Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Diagrammi di flusso Strutture per il flusso di controllo: Repeat-Until I O Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Diagrammi di flusso Strutture per il flusso di controllo: If-Then-Else I Then Else O Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Diagrammi di flusso Esempio calcolo di N! = N(N-1)(N-2)..1 Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Strutture dati Un problema è generalmente caratterizzato da una o più “variabili”. I dati in ingresso, i dati in uscita, i dati generati e consumati durante l’elaborazione, sono spesso indicati come variabili. Quando si assegnano dei valori precisi ai dati in ingresso, si definisca una “istanza” del problema. Ciascuna variabile è caratterizzata da un tipo. Il tipo è un nome che indica l'insieme di valori che una variabile, o il risultato di un'espressione (che tipicamente coinvolge più variabili), possono assumere e le operazioni che su tali valori si possono effettuare. Dire per esempio che la variabile X è di tipo "numero intero" significa affermare che X può assumere come valori solo numeri interi (appartenenti ad un certo intervallo) e che su tali valori sono ammesse solo certe operazioni (ad esempio le operazioni aritmetiche elementari). Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Strutture dati I tipi si dividono in tipi base (o primitivi) e tipi complessi (o derivati). I tipi base non possono essere decomposti, come i numeri interi, i numeri in virgola mobile, i booleani (questi ultimi possono assumere solo due valori: vero o falso), i caratteri (es. caratteri ASCII); ogni linguaggio tipizzato ne prevede un certo insieme. I tipi complessi si ottengono dai tipi atomici mediante opportuni operatori forniti dal linguaggio. Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Strutture dati Una struttura dati è un'entità usata per organizzare un insieme di dati all'interno della memoria del computer, ed eventualmente per allocarli in una memoria di massa. La scelta delle strutture dati da utilizzare è strettamente legata a quella degli algoritmi. A tal proposito, solitamente si utilizza il concetto unificato di “Algoritmi e Strutture Dati”. La scelta della struttura dati influsce inevitabilmente sull'efficienza degli algoritmi utilizzati. La struttura dati è un metodo di organizzazione dei dati, quindi prescinde dai dati effettivamente contenuti. Una struttura dati può contenere dati di tipo base, di tipo complesso, e anche altre strutture dati. Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Strutture dati ARRAY Un array è una struttura dati omogenea, che contiene un numero finito di elementi dello stesso tipo, ad esempio interi. Questi elementi sono individuati attraverso un indice numerico intero, che tipicamente va da 0 al numero massimo di elementi meno uno. 1. 2. int v[10] v[0] 5 La dimensione dell’array deve essere dichiarata al momento della sua creazione. L'accesso ad un elemento di un array ha un costo computazionale costante, mentre l'aggiunta o la rimozione di elementi in posizione casuale possono essere piuttosto onerose. Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Strutture dati ARRAY BIDIMENSIONALE (MATRICE) 1. 2. int v[10][5] v[0][2] 5 ARRAY MULTIDIMENSIONALE 1. 2. int v[10][5]..[7] v[0][2]..[0] 53 Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Strutture dati RECORD (o STRUTTURA) Un record definisce un tipo complesso. Gli elementi che lo compongono sono detti anche campi, e sono identificati da un nome. Un record può essere eterogeneo, cioè può contenere una combinazione di elementi di diverso tipo. struct { char nome[8]; char coloreDelPelo[8]; char coloreDegliOcchi[8]; int età; } Gatto; Gatto unGatto; unGatto.nome “Felix”; unGatto.età 2; Algoritmi e Strutture Dati definizione del record Gatto definizione della variabile unGatto di tipo Gatto Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Strutture dati CLASSE Una classe consiste di un record a cui sono associate anche delle operazioni. Una classe quindi è un altro modo di definire un tipo complesso. class Dog { private char name[8]; private char colour[8]; private char race[16]; private int age; } definizione della classe Dog int getName() { return name; } void setName(nome) { this.name = name; } … Dog aDog = new Dog; aDog.setName(“Fido”); Algoritmi e Strutture Dati definizione di una istanza della classe Dog (si dice che aDog è un oggetto di tipo Dog) Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Strutture dati LISTA CONCATENATA - gli elementi della lista sono disposti sequenzialmente come nell’array, ciascuno all’interno di un nodo che contiene anche un riferimento al nodo successivo (ed eventualmente a quello precedente) - la lista può crescere e decrescere di dimensione - cambiando i riferimenti nei nodi, la lista può essere riorganizzata Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Strutture dati STACK (PILA) Una pila è una struttura dati di tipo LIFO (Last In First Out). Operazioni: push() – inserisce un dato in cima alla pila pop() – estrae un dato dalla cima della pila Viene tipicamente realizzata con array o liste. Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Strutture dati QUEUE (CODA) Una pila è una struttura dati di tipo FIFO (First In First Out). Operazioni: insert() – inserisce un dato in fondo alla coda remove() – estrae un dato dalla testa Viene tipicamente realizzata con array o liste. Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Strutture dati GRAFO Ci sono due modi generali per rappresentare un grafo con una struttura dati utilizzabile da un programma: • • la lista delle adiacenze la matrice delle adiacenze Ua lista di adiacenze è una lista che mantiene un elenco di nodi, ed ad ogni nodo è collegata una lista di puntatori ai nodi collegati. Una matrice di adiacenze è una matrice N per N, dove N è il numero dei nodi, che mantiene un valore 1 nella cella (a,b) se il nodo a è collegato al nodo b (0 altrimenti). La matrice è simmetrica solo se il grafo non è orientato. Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Strutture dati GRAFO Indicati con V la cardinalità dell'insieme dei vertici del grafo e con E la cardinalità dell'insieme degli archi del grafo, le due rappresentazioni, quella mediante liste e quella mediante matrice delle adiacenze, richiedono rispettivamente Θ(V+E) e Θ(V2) spazio di memoria. Ognuna delle due rappresentazioni ha alcuni vantaggi: • una lista di adiacenze risulta più adatta a rappresentare grafi sparsi o con pochi archi, perciò è facile trovare tutti i nodi adiacenti ad un nodo dato e verificare l'esistenza di connessioni tra nodi; • una matrice di adiacenze è invece più indicata per descrivere grafi densi e con molti archi, inoltre rende più facile invertire i grafi e individuarne sottografi. Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Strutture dati GRAFO Grafo dei collegamenti della pagina principale di Wikipedia. http://www.wikipedia.org Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Strutture dati ALBERO E’ un grafo connesso che non contiene cicli. Per ogni coppia di nodi esiste un solo cammino che li connette. Se il numero dei nodi è V, il numero di archi è E=V-1. Attraversamento: preorder, postorder, inorder, levelorder. Molto usati sono gli alberi binari: • V nodi interni, V+1 nodi esterni • V nodi altezza ~ log2V Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Strutture dati ALBERO Es. Preorder: 1,2,3,5,8,9,6,10,4,7 Postorder: 2,8,9,5,10,6,3,7,4,1 Inorder: 2,1,8,5,9,3,10,6,7,4 Levelorder: 1,2,3,4,5,6,7,8,9,10 Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Strutture dati HEAP E’ un albero binario i cui nodi soddisfano la condizione di integrità: La chiave che identifica ciascun nodo deve essere ≥ della chiave dei nodi figli (se esistono). Operazioni: insert() – aggiunge un nuovo nodo replace() – sostituisce la radice corrente remove() – elimina la radice corrente extract() – elimina un nodo change() – sostituisce un nodo NOTA: questo è il max-heap; se nella condizione di integrità usiamo ≤, abbiamo il min-heap Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Tecniche di progettazione di algoritmi Per definire un algoritmo è necessario: • condurre un'attenta analisi del problema • individuare i possibili ingressi • precisare le uscite • definire completamente e dettagliatamente la sequenza dei passi che portano alla soluzione (è conveniente suddividere il problema in piccoli sottoproblemi) Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Tecniche di progettazione di algoritmi Dal particolare all’universale: INDUZIONE Dall’universale al particolare: DEDUZIONE Principio di induzione U={nєN: vale P(n)} dove P(n) è un predicato su N Se 1) si dimostra che vale P(0), cioè 0єU 2) P(n) => P(n+1), cioè nєU => n+1єU allora P(n) vale per ogni n, cioè U coincide con N 1) è detto passo base dell’induzione 2) è detto passo induttivo Es. per tutti gli nєN vale P(n) = 0+1+2+..+n = n(n+1)/2 Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Tecniche di progettazione di algoritmi Algoritmo ricorsivo contiene richiami a se stesso (ma deve esserci una condizione di terminazione). Es. N! = N(N-1)! Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Tecniche di progettazione di algoritmi Divide et Impera I. Si divide il problema (di dimensione n) in a sottoproblemi di dimensione inferiore n/b, operanti su sottoinsiemi disgiunti del set di dati. Questa fase richiede un tempo D(n). II. Si risolvono i sottoproblemi. Questa fase richiede un tempo aT(n/b). III. Si combinano le soluzioni dei sottoproblemi in modo da ottenere la soluzione del problema principale. Questa fase richiede un tempo C(n). NOTA: i sottoproblemi possono essere a loro volta risolti con la tecnica divide et impera (quindi operando in maniera ricorsiva). Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Tecniche di progettazione di algoritmi Ricerca esaustiva (metodo “forza bruta”) Consiste nel verificare tutte le soluzioni teoricamente possibili fino a che non si trova quella effettivamente corretta. Il suo principale fattore positivo è che porta sempre a trovare la soluzione corretta, ma è anche vero che è sempre la soluzione più lenta o dispendiosa; viene utilizzato come ultima risorsa sia in crittanalisi che in altre parti della matematica solamente in quei casi dove sia l'unica soluzione conosciuta. Es. Quando su un sistema informatico è possibile un attacco offline (ovvero quando l'attacco si può eseguire su una copia di lavoro locale del sistema da attaccare) si può barattare la velocità di esecuzione con la quantità di risorse necessarie (attacchi "distribuiti“). Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Tecniche di progettazione di algoritmi Backtracking (= ritorno all’indietro) E’ una tecnica per trovare soluzioni a problemi in cui devono essere soddisfatti dei vincoli. Con questa tecnica si considerano successivamente tutte le possibili soluzioni, scartando man mano le condizioni che non soddisfano i vincoli. Una tecnica classica consiste nell'esplorazione di strutture ad albero e tenere traccia di tutti i nodi e i rami visitati in precedenza, in modo da poter tornare indietro al più vicino nodo che conteneva un cammino ancora inesplorato nel caso che la ricerca nel ramo attuale non abbia successo. Es. Programmi per giocare a scacchi: generano tutte le mosse possibili per una profondità di N mosse a partire da quella attuale e poi esaminano con il backtracking le varie alternative, selezionando alla fine quella migliore. Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Tecniche di progettazione di algoritmi Greedy Ad ogni passo viene scelta la soluzione che è ottima o “greediest” (più golosa) localmente, senza preoccuparsi degli effetti successivi di tale scelta. La soluzione locale scelta può dipendere dalle scelte precedenti. Es. Il problema "Dai il minor numero di monete di resto utilizzando monete da 100, 10, 1 Euro" è un problema risolvibile tramite un algoritmo di tipo greedy: ad ogni passo viene controllato il resto ancora da dare e si aggiunge la moneta con valore maggiore possibile. Quindi per dare un resto di 112 Euro la macchina farà cadere in sequenza una moneta da 100, poi 10, poi 1 e poi 1 Euro per un totale di 4 monete. Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Tecniche di progettazione di algoritmi Programmazione dinamica Vengono risolti tutti i possibili sottoproblemi (a priori, in generale, non si sa quale sia il set di sottoproblemi migliore). Es. Problema dello zaino (knapsack problem): - Zaino di capacità M - N tipi di oggetti (ogni tipo ha un suo valore e spazio occupato) Per ogni i da 1 a M, troviamo • Cost(i) = max valore ottenibile per uno zaino di capacità i • Best(i) = ultimo oggetto messo nello zaino di capacità i per avere Cost(i) => Best(M) è nello zaino, e anche Best[M – size{Best(M)}], ecc. Costo dell’algoritmo: O(MN) Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Algoritmi di ordinamento Supponiamo di avere memorizzato un array di N elem, dove il tipo elem è un record contenente due campi: informazione e chiave. type elem = record informazione: tipo_informazione; chiave: int; end; elem a[N]; Vediamo una serie di metodi per ordinare le componenti dell’array secondo l’ordine crescente del campo chiave. Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Algoritmi di ordinamento BUBBLE SORT Confronta ogni elemento con il successivo e li scambia (swap) se necessario. Ripete finchè non si ha una passata senza swap. Complessità computazionale: O(N2) Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Algoritmi di ordinamento INSERTION SORT Parte dall’elemento in seconda posizione e lo confronta con il primo. Se necessario li scambia. Passa all’elemento in terza posizione e lo confronta con i precedenti, inserendolo se necessario in prima posizione, o tra il primo e il secondo. Prosegue con gli elementi nelle posizioni successive, inserendoli eventualmente tra l’insieme dei predecessori (≤) e quello dei predecessori (>). Complessità computazionale: O(N2) Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Algoritmi di ordinamento SELECTION SORT Per ogni i=0..N-1 trova il più piccolo elemento di a[i+1..N-1] e lo scambia con a[i]. Complessità computazionale: O(N2) Es. 31 11 11 11 25 25 12 12 12 12 25 22 22 22 22 25 Algoritmi e Strutture Dati 11 31 31 31 Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Algoritmi di ordinamento SHELL SORT Divide la lista in sottoinsiemi* e li ordina singolarmente con insertion sort. Raggruppa i sottoinsiemi in insiemi più grandi. Ordina questi ultimi con insertion sort. Ripete fino ad avere un unico insieme ordinato di cardinalità N. Complessità computazionale: O(N2) *: gli elementi dei sottoinsiemi non sono elementi contigui dell’insieme complessivo; se i sottoinsiemi sono M, gli elementi sono presi uno ogni M dall’insieme complessivo Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Algoritmi di ordinamento HEAP SORT for (i = 1; i ≤ N; i++) heap.insert(a[i]); For (i = N; i ≥ 1; i--) a[i] = heap.remove(); E’ più lento degli algoritmi MERGESORT e QUICKSORT, ma non usa array multipli e non è troppo ricorsivo, per cui per grandi quantità di dati è la soluzione migliore. Complessità computazionale: O(NlogN) Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Algoritmi di ordinamento MERGE SORT Divide l’array in due parti e le copia in due array distinti. Continua a dividere ricorsivamente. Quando restano array di 2 elementi ciascuno, li ordina. Rimette insieme gli array, ordinandoli dopo ciascuna fusione. Complessità computazionale: O(NlogN) Algoritmi e Strutture Dati Prof. M. Amoretti UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Algoritmi di ordinamento QUICKSORT Sceglie un elemento dell’array (è il PIVOT). Divide l’array in due gruppi: elementi < PIVOT elementi > PIVOT Ripete ricorsivamente per ciascun sottogruppo. Complessità computazionale: O(NlogN) Algoritmi e Strutture Dati Prof. M. Amoretti