Algoritmi e Strutture Dati

Documenti analoghi
Alberi ed Alberi Binari

Problemi di ordinamento

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

Alberi n-ari: specifiche sintattiche e semantiche. Realizzazioni. Visita di alberi n-ari.

Note per la Lezione 4 Ugo Vaccaro

Alberi e alberi binari I Un albero è un caso particolare di grafo

Algoritmi e Strutture Dati

Alberto Montresor Università di Trento

Alberi Binari di Ricerca

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

PILE E CODE. Pile (stack):

Algoritmi e Strutture Dati

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

Alberi binari e alberi binari di ricerca

Algoritmi e Strutture Dati

Grafi: visite. Una breve presentazione. F. Damiani - Alg. & Lab. 04/05 (da C. Demetrescu et al - McGraw-Hill)

Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo. Fosco.

Esercitazione: Implementazione in linguaggio C dell ADT. Stack con l utilizzo. di linked list

In questa lezione Strutture dati elementari: Pila Coda

La struttura dati CODA

Espressioni aritmetiche

Il tipo astratto coda con priorità: specifiche sintattiche e semantiche. Realizzazioni.

Struttura dati astratta Coda

Algoritmi e Strutture Dati. HeapSort

Questa soluzione va contemplata quando le lunghezze stimate dalle liste usate sono significativamente maggiori delle dimensioni di un elemento.

Heap e code di priorità

Liste con sentinella. intlist *createlist(void){ intlist *q = malloc(sizeof(intlist)); if(!q) { exit(-1); } q->next = q->prev = q; return q; }

Algoritmi e Strutture Dati

Implementazione ADT: Alberi

ADT Coda con priorità

Algoritmi e Strutture di Dati I 1. Algoritmi e Strutture di Dati I Massimo Franceschet francesc

Esercizio 1. E vero che in un AVL il minimo si trova in una foglia o nel penultimo livello? FB = -1. livello 0 FB = -1. livello 1 FB = -1.

Esercizi su strutture dati

Laboratorio di Python

In questa lezione Alberi binari di ricerca: la cancellazione

Esempi. non. orientato. orientato

Laboratorio di Python

Esercizi di Algoritmi e Strutture Dati

Alberi. Alberi: definizioni. Alberi Binari. Esercizi su alberi binari: metodi ricorsivi. Struttura dati per alberi generici. ASD-L - Luca Tesei

Strutture dati e loro organizzazione. Gabriella Trucco

Per semplicità eliminiamo le ripetizioni nell'albero.

Algoritmi (9 CFU) (A.A ) Heap e Algoritmo HeapSort. Prof. V. Cutello Algoritmi 1

Grafi: definizioni e visite

Algoritmi e Strutture Dati. Alberi

Albero binario. Alberi binari (introduzione) Terminologia. Alberi di ricerca binaria (BST)

Esercizi Capitolo 6 - Alberi binari di ricerca

Esercizi Strutture dati di tipo astratto

Appunti del corso di Informatica 1 (IN110 Fondamenti) 7 Grafi e alberi: introduzione

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste

Alberi binari di ricerca

GLI ALBERI BINARI DI RICERCA. Cosimo Laneve

Esercizi su alberi binari

lezione 9 min-heap binario Heap e Alberi posizionali generali

Indice PARTE A. Prefazione Gli Autori Ringraziamenti dell Editore La storia del C. Capitolo 1 Computer 1. Capitolo 2 Sistemi operativi 21 XVII XXIX

Capitolo 3: Gli alberi. Alberi n-ari

Strutture dati dinamiche in C (II)

I tipi di dato astratti

Lezione 7 Alberi binari: visite e alberi di ricerca

Transcript:

Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino A.A. 2006/07

Il concetto di dato Il concetto di tipo di dato Insertion Sort for j 2 to lenght[a] do key A[j] Si inserisce A[j] nella sequenza ordinata A[1..j-1] i j-1 while i > 0 e A[i] > key do A[i + 1] A[i] i i 1 A[i+1] key

Il concetto di dato Il concetto di tipo di dato Schema dell Insertion-Sort Ordinamento n numeri Insertion Sort Numeri ordinati A[1,...,n] = vettore i,j,key = variabili

Il concetto di dato Il concetto di tipo di dato Schema di un generico algoritmo Problema Input Algoritmi Output Dati

Il concetto di dato Il concetto di tipo di dato Strutture Dati Astratte (SDA) Dati: insieme di valori oggetti + Operazioni che consentono di manipolare i dati Dati Op 1 Op 2... Op n

Il concetto di dato Il concetto di tipo di dato Esempio di SDA Dati = insieme S di numeri OP 1 = estrai il minimo OP 2 = estrai il massimo OP 3 = restituisci la dimensione di S OP 4 = inserisci un nuovo numero in S

Il concetto di dato Il concetto di tipo di dato Insertion Sort for j 2 to size(a) Si inserisce A[j] nella sequenza ordinata A[1..j-1] i j-1 while i > 0 e read(j) > key do modify(i + 1, read(i)) i i-1 modify(i + 1, key)

Il concetto di dato Il concetto di tipo di dato Insertion Sort Insieme S di numeri ADS = + Read, Size, Modify DS = S = A[1,..., n] vettore Read(i) = A[i] Size(A) = n Modify(i, x) = A[i] = x

Il concetto di dato Il concetto di tipo di dato ADS vs DS ADS = che cosa vogliamo? DS = come lo implementiamo?

Il concetto di dato Il concetto di tipo di dato Quando una struttura dati è buona?? Quando non usa troppe risorse Risorse = Tempo Spazio di memoria Numero di processori...

Il concetto di dato Il concetto di tipo di dato Il concetto di Dato Un dato è tutto ciò su cui agisce un calcolatore A livello hardware tutti i dati sono rappresentati come sequenza di cifre binarie Linguaggi ad alto livello ci permettono di usare astrazioni tramite il concetto di tipo di dato

Il concetto di dato Il concetto di tipo di dato Tipo di dato Nei linguaggi di programmazione il tipo di dato determina l insieme dei valori (oggetti) che una variabile può rappresentare il tipo di dato, specifica le operazioni di interesse su un insieme di valori - o collezione di oggetti (es. inserisci, cancella, cerca, etc.) Ogni operatore accetta argomenti di uno o più tipi di dato fissato e produce risultati di un tipo di dato fissato

Il concetto di dato Il concetto di tipo di dato Gestione di collezioni di oggetti Struttura dati: un organizzazione dei dati che permette di supportare le operazioni di un tipo di dato in modo efficiente

Tipo di dato Dizionario Dati: un insieme di coppie (elem, chiave) Operazioni: insert(elem e, chiave k) aggiunge ad S una nuova coppia (e, k) delete(elem e, chiave k) cancella da S la coppia con chaive k search(chiave k) se la chiave k è presente in s restituisce l elemento e ad esso associato altrimenti restituisce null

Pile e Code Strutture Dati Astratte Pila: insieme di elementi gestiti secondo una politica LIFO (Last In First Out) l ultimo elemento inserito è il primo estratto Coda: insieme di elementi gestiti secondo una politica FIFO (First In First Out) il primo elemento inserito è il primo estratto

Il tipo di dato Pila Strutture Dati Astratte Dati: una sequenza S di n elementi Operazioni: isempty() boolean restituisce true se S è vuota, false altrimenti push(elem e) aggiunge e come ultimo elemento di S pop() elem toglie da S l ultimo elemento e lo restituisce top() elem restituisce l ultimo elemento di S (senza eliminarlo)

Il tipo di dato Pila Strutture Dati Astratte PUSH POP

Tipo di dato Coda Strutture Dati Astratte Dati: una sequenza S di n elementi Operazioni: isempty() boolean restituisce true se S è vuota, false altrimenti enqueue(elem e) aggiunge e come ultimo elemento di S dequeue() elem toglie da S l ultimo elemento e lo restituisce first() elem restituisce il primo elemento di S (senza eliminarlo)

Il tipo di dato Coda Strutture Dati Astratte enqueue dequeue

Tecniche di rappresentazione dei dati Rappresentazioni indicizzate: I dati sono contenuti in array Rappresentazioni collegate: I dati sono contenuti in record collegati fra loro mediante puntatori

Pro e contro Strutture Dati Astratte Rappresentazioni indicizzate: Pro: accesso diretto ai dati mediante indici Contro: dimensione fissa (riallocazione array richiede tempo lineare) Rappresentazioni collegate: Pro: dimensione variabile (aggiunta e rimozione record in tempo costante) Contro: accesso sequenziale ai dati

Esempi di strutture collegate: le next terminatore L I S T info record puntatore prev next L I S T info L I S T

Liste con sentinelle Strutture Dati Astratte -- L I S T -- lista con sentinelle vuota

Organizzazione gerarchica dei dati: Un albero radicato è una coppia T = (N, A) costituita da un insieme N di nodi ed un insieme A N N di coppie di nodi, detti archi. In un albero: ogni nodo v (tranne la radice) ha un solo padre u tale che (u, v) A. Nodi con lo stesso padre sono detti fratelli un nodo u può avere zero o più figli v tali che (u, v) A e, il loro numero è detto grado del nodo un nodo senza figli è detto foglia, mentre i nodi che non sono nè foglie nè la radice sono detti nodi interni la profondità (o livello) di un nodo è dato dal numero di archi che bisogna attraversare per raggiungerlo dalla radice altezza di un albero: massima profondità a cui si trova una foglia

Organizzazione gerarchica dei dati: Dati contenuti nei nodi, relazioni gerarchiche definite dagli archi che collegano coppie di nodi r radice livello 0 padre del nodo v arco (u,v) u nodo interno livello 1 altezza v z foglia livello 2 figlio del nodo u livello 3 fratelli

Rappresentazioni collegate di Rappresentazione con puntatori ai figli (nodi con numero limitato di figli) A B C D E F sin info des

Rappresentazioni collegate di lista dei puntatori ai figli A E F B D E Rappresentazione con di puntatori ai figli (nodi con un numero arbitrario di figli)

Rappresentazioni collegate di primo figlio A B D fratelli C F Rappresentazione con primo figlio fratello successivo (numero arbitrario di figli) E

Visite di Alberi Strutture Dati Astratte Algoritmi che consentono l accesso sistematico ai nodi e agli archi di un albero Gli algoritmi di visita si distinguono in base al particolare ordine di accesso ai vari nodi dell albero

Algoritmo di visita generica L algoritmo visitagenerica(nodo r) visita il nodo r e tutti i suoi discendenti in un albero visitagenerica(nodo r) S {r} while (S ) do estrai un nodo u da S visita il nodo u S S {figli di u}

Algoritmo di visita in profondità L algoritmo di visita in profondità (DFS, Depth-First-Search) parte da r e procede visitando i nodi di figlio in figlio fino a raggiungere una foglia Retrocede poi al primo antenato che ha figli non ancora visitati (se esiste) e ripete il procedimento a partire da uno di quei figli

Algoritmo di visita in profondità A ➊ A ➍ G D M B H E I C F G D M B H ➋ E ➌ I C F DFS(A) = A, B, D, G, E, H, I, C, F

Algoritmo di visita in profondità Versione iterativa (per binari) visitadfs(nodo r) Pila S S.push(r) while (not S.isEmpty()) do u S.pop() if (u null) then visita il nodo u S.push(figlio destro di u) S.push(figlio sinistro di u)

Algoritmo di visita in profondità Versione ricorsiva (per binari) visitadfsricorsiva(nodo r) if (r = null) return visita il nodo r visitadfsricorsiva(figlio sinistro di r) visitadfsricorsiva(figlio destro di r) Questa versione dell algoritmo di visita in prondità viene anche detta visita in preordine

Tre varianti classiche dell algoritmo di visita in profondità Visita in preordine: si visita prima la radice e poi si effettuano le chiamate ricorsive sul figlio sinistro e destro Visita simmetrica: si effettua prima la chiamata ricorsiva sul figlio sinistro, poi si visita la radice ed, infine, si effettua la chiamata ricorsiva sul figlio destro Visita in postordine: si effettuano prima le chiamate ricorsive sul figlio sinistro e destro e poi si visita la radice

Tre varianti classiche dell algoritmo di visita in profondità A B C G D M H E I F visita in preordine: A, B, D, G, E, H, I, C, F visita simmetrica: G, D, B, H, E, I, A, C, F visita in postordine: G, D, H, I, E, B, F, C, A

Visita simmetrica Strutture Dati Astratte Versione ricorsiva (per binari) visitasimmetrica(nodo r) Rispetto a visitadfsricorsiva, basta invertire la chiamata ricorsiva sul sottoalbero sinistro e la visita della radice if (r = null) return visitadfsricorsiva(figlio sinistro di r) visita il nodo r visitadfsricorsiva(figlio destro di r)

Visita in postordine Strutture Dati Astratte Versione ricorsiva (per binari) visitainpostordine(nodo r) Rispetto a visitadfsricorsiva, basta effettuare la visita della radice solo dopo le chiamate ricorsive sui figli if (r = null) return visitadfsricorsiva(figlio sinistro di r) visitadfsricorsiva(figlio destro di r) visita il nodo r

Algoritmo di visita in ampiezza L algoritmo di visita in ampiezza (BFS, Breadth-First-Search) parte da r e procede visitando i nodi per livelli successivi Un nodo sul livello i può essere visitato solo se tutti i nodi sul livello i 1 sono stati visitati

Algoritmo di visita in profondità A A ➊ B C B ➋ C D E F D E ➌ F G M H I G M H ➍ I BFS(A) = A, B, C, D, E, F, G, H, I

Algoritmo di visita in ampiezza Versione iterativa (per binari) visitadfs(nodo r) Coda C C.enqueue(r) while (not C.isEmpty()) do u C.dequeue() if (u null) then visita il nodo u C.enqueue(figlio sinistro di u) C.enqueue(figlio destro di u)

Riepilogo Strutture Dati Astratte Nozione di tipo di dato come specifica delle operazioni su una collezione di oggetti Rappresentazioni indicizzate e collegate di collezioni di dati: pro e contro Organizzazione gerarchica dei dati mediante Rappresentazioni collegate classiche di Algoritmi di esplorazione sistematica dei nodi di un albero (algoritmi di visita)