Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a. 2001-2002 – 3° ciclo.

Slides:



Advertisements
Presentazioni simili
Strutture dati per insiemi disgiunti
Advertisements

Tipi di dato astratti Lista, Pila, Coda, Albero.
Estendere i linguaggi: i tipi di dato astratti
Strutture dati lineari
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
UD 3: “Le Liste” UD 4: “Pile e Code” UD 5: “Alberi e grafi”
Algoritmi Avanzati Grafi e Alberi
Strutture dati elementari
Alberi binari di ricerca
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Liste.
Esercizi su alberi binari
Tail recursion: esempio
Alberi binari Definizione della struttura dati: struct tree { };
Il problema del dizionario
Interrogazioni su un albero binario di ricerca Search(S,k) – dato un insieme S ed un valore chiave k restituisce un puntatore x ad un elemento in S tale.
Allocazione dinamica della memoria
Algoritmi e Strutture Dati Alberi Binari di Ricerca.
tipo astratto, implementazione, algoritmi
Albero: insieme di punti chiamati NODI e linee chiamate EDGES
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Esercizi su code Date due code in ingresso a valori interi in ordine crescente, scrivere una funzione che restituisca una terza coda che contenga i valori.
Esercizi su alberi binari
Fondamenti di Informatica
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
1.Scrivere una funzione per cercare un numero x in una lista circolare di interi. La funzione deve restituire NULL se il numero non esiste. 2.Scrivere.
1 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp =
Strutture dati per insiemi disgiunti
15 maggio 2002 Avvisi: Ultima lezione: mercoledì 29 maggio II Esonero: mercoledì 5 giugno, ora da stabilire.
Corso di informatica Athena – Periti Informatici
Esercizi Liste.
Grafi Rappresentazione mediante liste di adiacenza:
Tail recursion: esempio
Esercizi su alberi binari di ricerca
Alberi binari Definizione della struttura dati: struct tree { };
Corso di Informatica 2 a.a. 2003/04 Lezione 6
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 5 Le strutture informative Corso di Informatica 2 a.a. 2003/04 Lezione 5.
Schiavone & Scalas 2 In informatica, il termine stack o pila viene usato in diversi contesti per riferirsi a strutture dati le cui modalità d'accesso.
Alberi CORDA – Informatica A. Ferrari Testi da
alberi completamente sbilanciati
Struttura di una lista legata Una lista legata è una variabile strutturata in cui ogni elemento mantiene l’indirizzo (mediante un puntatore) dell’elemento.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Pile e Code.
Heap concetti ed applicazioni. maggio 2002ASD - Heap2 heap heap = catasta condizione di heap 1.albero binario perfettamente bilanciato 2.tutte le foglie.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Alberi Alberi radicati : alberi liberi in cui un vertice è stato scelto come radice. Alberi liberi : grafi non orientati connessi e senza cicli. Alberi.
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
Algoritmi e Strutture Dati Strutture Dati Elementari.
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Alberi.
MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche
Prog2 a.a. 2001/ Albero binario di ricerca Un albero binario di ricerca é un albero binario in cui ogni nodo ha un’etichetta.
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Strutture Dati.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
1 Strutture dati. 2 Astrazione Non vogliamo sapere l’organizzazione fisica dei dati  indirizzi e celle di memoria Ci interessa solo la loro organizzazione.
Ordinamento dei vettori (SELECTION-SORT) Ordinamento per selezione (selection- sort) Si cerca l’elemento più piccolo e si scambia con l’elemento in posizione.
1 Un esempio con iteratore: le liste ordinate di interi.
Corso di Algoritmi e Strutture Dati con Laboratorio Java Collections Framework (II parte)
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE ABACUS Ud1Strutture dati lineariTempi -Liste semplicemente puntate 3h+3h.
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Strutture dati di tipo astratto 19 Strutture dati,
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE INFORMATICA Focus on.
Transcript della presentazione:

Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo

Liste concatenate Una lista concatenata (linked list) è una sequenza lineare di oggetti connessi attraverso dei puntatori detti link. Lacceso ad una lista concatenata avviene per mezzo di un puntatore al suo primo nodo; ai successivi si accede con il link allelemento successivo immagazzinato in ogni nodo. Gli elementi di una lista concatenata sono creati e memorizzati dinamicamente (solo quando necessario). Si possono avere liste ramificate i cui elementi puntano ad intere liste. Tutti gli elementi di una qualunque lista sono strutture dello stesso tipo per rendere agevoli le operazioni di scorrimento; il tipo del puntatore dipende infatti dal tipo dellelemento puntato.

Code e pile Le code e le pile sono anchesse delle strutture dati lineari; possono essere considerate come liste concatenate con alcune restrizioni sulle modalità di accesso agli elementi (FIFO, LIFO). Gli alberi sono strutture dati non lineari.

Coda (queue) In una coda (queue) gli elementi sono gestiti esclusivamente con una politica FIFO (first-in, first-out), ovvero si può eliminare un elemento solo dalla testa della coda e si può inserire solo in fondo alla coda.

Coda L'estremità della lista in cui è consentita l'estrazione è chiamata testa, o cima mentre lestremità in cui avviene linserimento è chiamata coda, o fondo testacoda

Operazioni primitive sulla Coda VUOTA(S): coda boolean. Test di CODA vuota. INCODA(S,x): coda, valore coda. Inserimento dell'elemento x in fondo alla coda. Se S è la CODA a 1, a 2,…, a n, INCODA(S,x) restituisce a 1, a 2,…, a n, x e il nuovo elemento di coda è x. OUTCODA(S): coda coda. Eliminazione dell'elemento in testa alla coda. Se S è la CODA a 1, a 2,…, a n, OUTCODA(S) restituisce a 2,a 3,…, a n e la nuova testa è rappresentata dalla posizione dell'elemento a 2. PRIMO(S) coda valore. Lettura dell'elemento in testa alla CODA.

Pile (stack) Una pila o stack è una lista concatenata sulla quale i nuovi elementi possono essere aggiunti e/o rimossi soltanto dalla sua sommità (top), ovvero lultimo elemento ad entrare è anche il primo ad uscire (last-in, first-out LIFO). Le altre caratteristiche di lista restano inalterate: si punta ad una pila mediante un puntatore allelemento in cima alla pila ed il membro di link dellultimo elemento è impostato a null per indicare la fine della pila.

Pila L'estremità della lista in cui è consentito l'inserimento e l'estrazione è chiamata top, o cima top

Operazioni primitive sulla Coda VUOTA(S): coda boolean. Test di CODA vuota. INCODA(S,x): coda, valore coda. Inserimento dell'elemento x in fondo alla coda. Se S è la CODA a 1, a 2,…, a n, INCODA(S,x) restituisce a 1, a 2,…, a n, x e il nuovo elemento di coda è x. OUTCODA(S): coda coda. Eliminazione dell'elemento in testa alla coda. Se S è la CODA a 1, a 2,…, a n, OUTCODA(S) restituisce a 2,a 3,…, a n e la nuova testa è rappresentata dalla posizione dell'elemento a 2. PRIMO(S) coda valore. Lettura dell'elemento in testa alla CODA.

Inserimento di un nuovo elemento Linserimento di un nuovo elemento nella coda o nella pila prevede sempre i seguenti passi: 1) Creazione di un nuovo nodo (allocazione dinamica) 2) Assegnazione di valori ai campi dati 3) Collegamento del nuovo elemento alla struttura esistente aggiornamento del campo puntatore del nodo aggiornamento dei puntatori della lista Queste due ultime operazioni caratterizzeranno la tipologia dell inserimento in coda o in pila.

Creazione di un nuovo nodo La creazione di un nuovo nodo avviene creando una nuova istanza della struttura tramite allocazione dinamica, utilizzando di solito un puntatore dappoggio ( tempp ) Es.: rec* tempp = new rec; tempp infonext

Assegnazione di valori ai campi dati Lassegnazione di valori ai campi dati si ottiene dereferenziando il puntatore al nodo e accedendo ai singoli dati, ovvero utilizzando direttamente loperatore -> Es.: tempp->info=7; tempp infonext 7

Inserimento in testa alla pila (push) Le operazioni di collegamento per linserimento in testa (push) alla pila, utilizzano il riferimento esplicito al top della pila (il puntatore alla pila lis). Il campo next del nuovo elemento punterà allo stesso valore di lis lis punterà al nuovo elemento tempp->next=lis; lis=tempp;

Inserimento in testa alla pila (push) 0 dato 0 tempp tempp->next = lis; lis = tempp; lis tempp lis tempp lis 0 0 dato 0 0 tempp lis 0 tempp

Eliminazione di un elemento dalla testa della coda (dequeue) Leliminazione di un elemento dalla coda prevede: Salvataggio dellelemento in una variabile ausiliaria (per passo 3) Scollegamento dellelemento dalla testa della coda (aggiornamento dei puntatori della coda) Distruzione dellelemento (deallocazione della memoria) In ogni caso, bisogna verificare che la coda non sia già vuota! if (lis != NULL) …

Eliminazione del nodo di testa della pila (pop) Bisogna aggiornare il puntatore alla testa lis che dovrà puntare allelemento successivo a quello da eliminare. rec* tempp=lis; (salvataggio elemento da eliminare) lis = tempp->next; (aggiornamento lista) delete tempp; (distruzione elemento)

Eliminazione dellelemento di testa della coda (dequeue) Bisogna aggiornare il puntatore alla testa lis che dovrà puntare allelemento successivo, ovvero a quello che ora è il secondo. rec* tempp=lis; (salvataggio elemento da eliminare) lis = tempp->next; (aggiornamento coda) delete tempp; (distruzione elemento)

void instesta(rec*& lis, int a) { rec* p = new rec; p->info = a; p->next = lis; lis = p; } push Inserimento in pila e in coda void insfondo(rec*& lis, int a) { rec* p = lis; for (rec* q = p; q != NULL; q = q->next) p = q; q = new rec; q->info = a; q->next = NULL; if (p != NULL) p->next = q; else lis = q; } inqueue

BOOL esttesta(rec*& lis, int& a) { rec* p = lis; if (lis != NULL) { a = lis->info; lis = lis->next; delete p; return T; } return F; } Estrazione dalla testa Pop / Dequeue

Alberi Un albero è una struttura dati non lineare i cui nodi contengono due o più link. I nodi di un albero binario contengono esattamente due link. Il primo nodo di ogni albero si chiama radice e per definizione non discende da nessun altro nodo. Un nodo da cui non discende nessun altro nodo si chiama foglia.

Alberi In ogni albero: tutti i nodi ad eccezione delle foglie sono detti nodi padre; Tutti i nodi ad eccezione della radice sono detti nodi figlio. Ogni nodo padre può avere 0, 1,2,…n figli Ogni nodo figlio può avere un solo padre. Gli alberi n-ari possono avere un numero qualsivoglia di figli per ciascun nodo. Gli alberi binari possono avere 0, 1, o al più 2 figli per ciascun nodo

Albero binario (def. ricorsiva) Un albero binario è un insieme finito di nodi che: o è vuoto o è costituito da un nodo speciale detto radice e da due sottoinsiemi (disgiunti) di nodi che sono a loro volta alberi binari (sottoalbero sinistro e sottoalbero destro)

Albero binario Un albero binario in C++ può essere rappresentato associando ad ogni nodo una struttura avente un campo informazione e due campi puntatore. Il tipo di ogni nodo si può definire come: struct nodo { char inf; nodo* sin; nodo* des; };

Albero binario ordinato per contenuto (inserimento) Se lalbero è vuoto, crea il nodo radice e inserisci linformazione, altrimenti considera linserimento nel sottoalbero sinistro o destro a seconda che linformazione da inserire sia minore o maggiore di quella contenuta nella radice (se linformazione ha valore uguale a quello della radice, non viene effettuato linserimento).

Albero binario ordinato per contenuto (inserimento) nodo* inserisci (nodo* r, int d) {if (r==0) { r=new nodo; r->inf=d; r->sin=0; r->des=0; } else if (d inf) r-> sin=inserisci (r- >sin,d); else if (d>r->inf) r-> des=inserisci (r- >des,d); return r; };

Visita di un albero Per estrarre il valore di ciascun elemento (nodo) dellalbero binario, si effettua una operazione di visita, ovvero si esaminano tutti i nodi dellalbero in un certo ordine. Le visite più significative sono: visita in preordine visita in postordine visita in ordine simmetrico

Visita in preordine Se lalbero non è vuoto, visita la radice, visita in preordine il sottoalbero sinistro, visita in preordine il sottoalbero destro. void voa(nodo* r) {if (r!=0) { cout inf; voa(r->sin); voa(r->des); } };

Visita in postordine Se lalbero non è vuoto, visita in postordine il sottoalbero sinistro, visita in postordine il sottoalbero destro, visita la radice. void vod(nodo* r) {if (r!=0) { vod(r->sin); vod (r-> des); cout inf;} };

Visita in ordine simmetrico Se lalbero non è vuoto, visita in ordine simmetrico il sottoalbero sinistro, visita la radice, visita in ordine simmetrico il sottoalbero destro. void vos(nodo* r) {if (r!=0) {vos(r->sin); cout inf; vos(r->des); } };