strutture dati - ce.unipr.it · 1 strutture dati organizzazione sistematica dei dati e del loro...

15
Strutture dati Organizzazione sistematica dei dati e del loro accesso Strutture dati Tipi di dato astratti (strutture dati dinamiche) q Strutture dati elementari n Liste n Stack (pile) n Code q Alberi n Alberi binari n Alberi di ricerca (BST) n Alberi bilanciati (AVL) n B-tree (gestione memoria secondaria) q Grafi Tipo di dato astratto r Tipo di dato astratto o ADT (Abstract Data Type): insieme di oggetti e insieme di operazioni definite su di esso r Es.: lista con operazioni di inserimento e cancellazione r Attenzione: l’ADT specifica cosa fa ogni operazione, non come r In Java: o Rappresentazione con interfaccia o Implementazione con classe Strutture dati Tipi di dato astratti (strutture dati dinamiche) q Strutture dati elementari n Liste n Stack (pile) n Code q Alberi n Alberi binari n Alberi di ricerca (BST) n Alberi bilanciati (AVL) n B-tree (gestione memoria secondaria) q Grafi Tipo di dato Lista n Insieme di elementi tra i quali è definito un ordinamento totale. n Numerose varianti n Ammette (almeno) le operazioni seguenti: q cons(elem): inserisce elem in testa alla lista q cdr(): elimina l’ elemento in testa alla lista q car(): restituisce l’ elemento in testa alla lista senza eliminarlo q null(): verifica se la lista e’ vuota n Nelle implementazioni (es. Java) sono spesso presenti altre operazioni q cons(elem, i), remove(i), get(i) Liste n si usa quando è necessario scandire un insieme di oggetti in modo sequenziale n è vantaggiosa quando sono previste frequenti operazioni di cancellazione o inserzioni n lo svantaggio sta nel fatto che si può accedere ad un elemento di posizione i solo dopo aver acceduto a tutti gli i-1 elementi precedenti

Upload: ledung

Post on 15-Feb-2019

221 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Strutture dati - ce.unipr.it · 1 Strutture dati Organizzazione sistematica dei dati e del loro accesso Strutture dati Tipi di dato astratti (strutture dati dinamiche) q Strutture

1

Strutture dati

Organizzazione sistematica deidati e del loro accesso

Strutture datiTipi di dato astratti

(strutture dati dinamiche)q Strutture dati elementari

n Listen Stack (pile)n Code

q Alberin Alberi binarin Alberi di ricerca (BST)n Alberi bilanciati (AVL)n B-tree (gestione memoria secondaria)

q Grafi

Tipo di dato astratto

r Tipo di dato astratto o ADT (Abstract Data Type): insieme di oggetti e insieme di operazioni definite su di essorEs.: lista con operazioni di inserimento e

cancellazioner Attenzione: l’ADT specifica cosa fa ogni operazione,

non comer In Java:

o Rappresentazione con interfacciao Implementazione con classe

Strutture datiTipi di dato astratti

(strutture dati dinamiche)q Strutture dati elementari

n Listen Stack (pile)n Code

q Alberin Alberi binarin Alberi di ricerca (BST)n Alberi bilanciati (AVL)n B-tree (gestione memoria secondaria)

q Grafi

Tipo di dato Listan Insieme di elementi tra i quali è definito un

ordinamento totale.n Numerose variantin Ammette (almeno) le operazioni seguenti:

q cons(elem): inserisce elem in testa alla listaq cdr(): elimina l’ elemento in testa alla listaq car(): restituisce l’ elemento in testa alla lista senza

eliminarloq null(): verifica se la lista e’ vuota

n Nelle implementazioni (es. Java) sono spessopresenti altre operazioniq cons(elem, i), remove(i), get(i)

Listen si usa quando è necessario scandire un

insieme di oggetti in modo sequenzialen è vantaggiosa quando sono previste frequenti

operazioni di cancellazione o inserzionin lo svantaggio sta nel fatto che si può

accedere ad un elemento di posizione i solo dopo aver acceduto a tutti gli i-1 elementi precedenti

Page 2: Strutture dati - ce.unipr.it · 1 Strutture dati Organizzazione sistematica dei dati e del loro accesso Strutture dati Tipi di dato astratti (strutture dati dinamiche) q Strutture

2

Implementazione delle liste

n Arrayq Si usa un array in memoria

n Strutture collegateq Ogni elemento contiene un riferimento al

successivo

Implementazione con array

r Occorre conoscere la dimensione max dellalista

r Può portare a spreco dimemoria

n Costo delle principalioperazioni:q cons: O(n) (caso

peggiore: elemento in prima posizione)

q cdr: O(n), (casopeggiore: primo elemento)

q car: O(1)

Inserimento in pos. 2

A0 A1 A2 AN-3AN-2AN-1 Elemento non usato

Implementazione con strutture collegate

n Efficienzaq cons, remove: O(i) (bisogna trovare la posizione

dell’elemento da inserire/rimuovere). O(1) per inserimenti/cancellazioni in prima posizione

q get: O(i) (posizione dell’elemento cercato)

A0 A1 Ai AN

Inserimento in pos. 1

Altri tipi di lista

n Lista doppia: consente una scansione in entrambe le direzioni

r Lista circolare: consente di rappresentare strutture in cui l’ordinamento è mod N

A0 A1 Ai AN

A0 A1 Ai AN

Strutture datiTipi di dato astratti

(strutture dati dinamiche)q Strutture dati elementarin Listen Stack (pile)n Code

q Alberin Alberi binarin Alberi di ricerca (BST)n Alberi bilanciati (AVL)n B-tree (gestione memoria secondaria)

q Grafi

Tipo astratto Pilan Lista nella quale inserimenti e cancellazioni avvengono solo

in testa (disciplina LIFO).

n Operazioni sempre presenti

q push(el): inserisce l'elemento specificato da el in cima alla

pila

q pop(): elimina l'elemento in cima alla pila

q top(): restituisce l'elemento in cima alla pila senza cancellarlo

dalla lista

q isEmpty(): verifica se la pila è vuota

n Altre operazioni

q clear(): elimina tutti gli elementi dalla pila

Page 3: Strutture dati - ce.unipr.it · 1 Strutture dati Organizzazione sistematica dei dati e del loro accesso Strutture dati Tipi di dato astratti (strutture dati dinamiche) q Strutture

3

Implementazione del tipo Pila

r Realizzazione tramite Array

r Liste: realizzazione tramite lista concatenata

A0

A1

Ai top = i

A0 A1 Ai AN

top

Start

Strutture datiTipi di dato astratti

(strutture dati dinamiche)q Strutture dati elementari

n Listen Stack (pile)n Code

q Alberin Alberi binarin Alberi di ricerca (BST)n Alberi bilanciati (AVL)n B-tree (gestione memoria secondaria)

q Grafi

Tipo astratto codan Lista nella quale gli inserimenti avvengono in coda e le

cancellazioni (estrazioni) in testa (disciplina FIFO)n Operazioni sempre presenti

q isEmpty(): verifica se la coda è vuotaq enqueue(el): inserisce l'elemento specificato da el

alla fine della codaq dequeue(): elimina il primo elemento della codaq firstEl(): restituisce il primo elemento della coda

senza eliminarlo

n Altre operazioniq clear(): elimina tutti gli elementi dalla coda

Implementazione di code

A0 A1 A2 AN-3 AN-2 AN-1

testa coda

Elemento non usato

enqueue -> coda = coda + 1 (mod N)dequeue -> testa = testa + 1 (mod N)Se (coda == testa – 1 mod N) coda pienaSe (coda == testa) coda vuota (un solo elemento presente)

Con array

Con liste concatenate

Strutture datiTipi di dato astratti

(strutture dati dinamiche)q Strutture dati elementarin Listen Stack (pile)n Code

q Alberin Alberi binarin Alberi di ricerca (BST)n Alberi bilanciati (AVL)n B-tree (gestione memoria secondaria)

q Grafi

alberi

definizione, algoritmi di visita, alberi binari

Page 4: Strutture dati - ce.unipr.it · 1 Strutture dati Organizzazione sistematica dei dati e del loro accesso Strutture dati Tipi di dato astratti (strutture dati dinamiche) q Strutture

4

Tipo di dato astratto albero

n insieme vuoto di nodi oppure costituito da una radice R e da 0 o più alberi (sottoalberi)

n la radice di ogni sottoalbero è collegata a R da un arco

T1 T2 Tn

R

es.: radice R con n sottoalberi

Terminologia

n genitore, figlio, fratelloq concetti intuitivi

n nodoq foglia se ha zero figliq interno se ha almeno un figlio

radice

foglia

nodo interno

Terminologia

n livello di un nodoq lunghezza (n.ro nodi)

percorso radice-nodo

n ramoq percorso radice-foglia

n altezza alberoq lunghezza (n.ro nodi) ramo

più lungoaltezza = 3

livello radice = 1

Esempi di alberi

n alberi genealogicin gerarchie di ereditarietà

q ad es., in Javan classificazioni di specie animalin organizzazione del territorio

q continente, nazione, regione, provincia eccn (alcuni) organigrammin file systemn domini Internet

Rappresentazione di alberi con liste collegate

R

A B

C

Elemento

Riferimento al primo figlio

Riferimento al prossimo fratello

Primo figliodi R

Fratello di A

livello di C = 3

Operazioni sugli alberi

n operazioni più importantiq element(v): restituisce l’elemento memorizzato nel

nodo vq root(): restituisce la radice dell’alberoq parent(v): restituisce il genitore del nodo vq children(v): restituisce i figli di vq isLeaf(v): restituisce true se v è una fogliaq isRoot(v): restituisce true se v è la radice

Page 5: Strutture dati - ce.unipr.it · 1 Strutture dati Organizzazione sistematica dei dati e del loro accesso Strutture dati Tipi di dato astratti (strutture dati dinamiche) q Strutture

5

Operazioni sugli alberin Altre operazioni

q livello di un nodoq altezza dell’alberoq # nodiq # foglieq max # di figli di un nodo dell’alberoq isEmptyn true se l’albero ha zero nodi

Algoritmi su alberi

n visita (o attraversamento) di un alberoq in profondità (depth-first search, a scandaglio):

DFSn vengono visitati i rami, uno dopo l’altro

q in ampiezza (breadth-first search, a ventaglio): BFSn a livelli, partendo dalla radice

visite in profondità/preordinen in preordine (preorder, o ordine anticipato)

q dato un nodo vn visita vn visita i sotto-alberi aventi come radice i figli di v, da sinistra verso

destran in ordine simmetrico (inorder)

q dato un nodo v con k sotto-alberin visita il primo sotto-albero (radice v.firstChild)n visita vn visita gli altri k-1 sotto-alberi

n in postordine (postorder, o ordine posticipato)q dato un nodo vn visita i sotto-alberi aventi come radice i figli di v, da sinistra verso

destran visita v

Visite in profondità

7

1 3 6

2 4 5

2

1 4 6

3 5 7

1

2 3 5

4 6 7

preordine inordine postordine

visita in ampiezza (usa una coda)

1

2 3 4

5 6 7

BFS

Alberi binari

n un albero si dice binario se ogni nodo può avere al più 2 figliq la rappresentazione si semplifica

n strutture dati per alberi binariq vettori q rappresentazioni collegate

Page 6: Strutture dati - ce.unipr.it · 1 Strutture dati Organizzazione sistematica dei dati e del loro accesso Strutture dati Tipi di dato astratti (strutture dati dinamiche) q Strutture

6

uso di vettorin ogni nodo v è memorizzato in posizione p(v)

q se v è la radice allora p(v)=1 (indice 0 in Java, C, C++)q se v è il figlio sinistro di u allora p(v)=2p(u)q se v è il figlio destro di u allora

p(v)=2p(u)+1

1

2

6 7

3

4

1234-67-

Alberi binari di ricerca (BST)

nBinary Search Tree

Dizionarin Tipo di dato astratto che supporta le seguenti

operazioni:q searchq insertq delete (remove)

n le liste possono essere usate come dizionariq le tre operazioni hanno costo lineare (sia nel worst case

sia in quello average)q in molti casi un costo lineare è giudicato inaccettabile

q strutture più efficienti?n alberi di ricerca bilanciatin tavole hash

Albero binario di ricercaalbero binario che soddisfa la seguente proprietà

Ø per ogni nodo, tutte le chiavi nel suo sottoalbero sinistro sono ≤ della chiave v associata al nodo e tutti le chiavi nel suo sottoalbero destro sono ≥ di v

n utilizzabile quando le chiavi appartengono a un universo totalmente ordinato

n Una visita simmetrica (inorder) dell’albero da’ le chiavi dell’albero in modo non descrescente

n ipotesi semplificativa di lavoro: chiavi strettamente minori nei sottoalberi sinistri e strettamente maggiori nei sotto alberi destri

albero binario di ricerca

49

91

57

8222

17

20

88

94

49

91

47

8222

17

20

88

94errato!ok

Costi delle operazioni nei BST: ricerca di un elemento

search(tree T, int x) { v = root(T)while (v != null) {

if (x == key(v)) return v; else if (x < key(v)) v = left child (v);

else v = right child (v); }return null;

}

ricorda la ricerca binaria!

Page 7: Strutture dati - ce.unipr.it · 1 Strutture dati Organizzazione sistematica dei dati e del loro accesso Strutture dati Tipi di dato astratti (strutture dati dinamiche) q Strutture

7

costo della ricerca in un BSTBST di n nodin caso peggiore

q O(n)n caso medio

q dipende dalla distribuzionen caso migliore

q O(1) (poco interessante)n nel caso di distribuzione uniforme delle chiavi il

valore atteso dell'altezza dell'albero è O(log n)

Ø istanze problematiche: alberi molto profondi e sbilanciati...

49

52

56

67

77

83

54

75

21

Costi delle operazioni nei BST

n costo dell'inserimento in un BSTq ogni inserimento introduce una nuova fogliaq il costo è (proporzionale a) la lunghezza del ramo

radice-fogliaq nel caso peggiore O(n )

Ø istanze problematiche nei BST : alberi molto profondi e sbilanciati...

Alberi bilanciati

nil costo delle varie operazioni su BST è O(h),dove h = altezza dell’alberonpuò essere O(n) worst case!!!nse l’albero fosse bilanciato…nma poi dobbiamo mantenerlo tale quando inseriamo o cancelliamo elementi!

Introduzione al bilanciamento

n nozione intuitiva di bilanciamentoq tutti i rami di un albero hanno

approssimativamente la stessa lunghezzaq ciascun nodo interno ha “molti” figli

n caso ideale per un albero k-arioq ciascun nodo ha 0 o k figliq la lunghezza di due rami qualsiasi differisce di al

più una unità

Bilanciamento perfetto

n un albero binario perfettamente bilanciato di n nodi ha altezza

3421 63

6 18 28 32

16 30

37 52

43 72 1lg2 +n

se ogni nodo ha 0 o 2 figlile foglie sono circa il 50% dei nodi (interni +foglie)

bilanciamento perfetto

n Il caso binario e’ facilmente generalizzabile ad alberi di parità k

q

n costo di ricerca/inserimento/eliminazione O(log n)n ripetuti inserimenti/eliminazioni possono distruggere

il bilanciamento

q degrado delle prestazioni

knknnkn 1)1( 1)1( fif

+−=⇒+−=

Page 8: Strutture dati - ce.unipr.it · 1 Strutture dati Organizzazione sistematica dei dati e del loro accesso Strutture dati Tipi di dato astratti (strutture dati dinamiche) q Strutture

8

bilanciamento in altezza

n un albero è bilanciato in altezza se le altezze dei sottoalberi sinistro e destro di ogni nododifferiscono di al più un’unità

n gli alberi bilanciati in altezza sono detti alberi AVLq da Adel’son-Vel’skii & Landis, primi proponenti

n Alberi di fibonacciq alberi AVL col minimo numero di nodi (fissata

l’altezza)

Fattore di bilanciamento

n un albero AVL è quindi un albero binario di ricerca in cui ad ogni nodo v viene associato un valore detto fattore di bilanciamento che corrisponde alla differenza tra la profondita’del sottoalbero sinistro e quello del sottoalbero destro di v

n Il fattore di bilanciamento puo’ assumere solo I valori -1,0, 1

fattore di bilanciamento

3421 63

6 18 28

16 30

37 52

43 72

3 29 57

7832

0

-1

+1

fattore di bilanciamento (FDB):altezza sottoalbero dx –altezza sottoalbero sx

in un albero bilanciato in altezza |FDB| ≤ 1, per ogni nodo

28

Bilanciamento

n Mantenere la proprieta’ di bilanciamentodurante inseriementi e cancellazionigarantisce che l’operazione di ricerca abbiasempre costo logaritmico e quindi sia moltoefficiente

inserimento in AVL

1. inserire nuovo nodo come in un BST il nuovo nodo diviene una foglia

2. ricalcolare i fattori di bilanciamento che sono mutati in seguito all’inserimento

solo nel ramo interessato all’inserimento (gli altri fattori non possono mutare), dal basso verso l’alto

3. se nel ramo appare un fattore di bilanciamento pari a ±2 occorre ribilanciare

tramite “rotazioni”

Rotazioni

n L’idea alla base delle rotazioni e’ quella diportare l’elemento centrale alla radicedell’albero e di far discendere l’elemento checausa lo sbilanciamento

Page 9: Strutture dati - ce.unipr.it · 1 Strutture dati Organizzazione sistematica dei dati e del loro accesso Strutture dati Tipi di dato astratti (strutture dati dinamiche) q Strutture

9

rotazione

verso sinistra o verso destra

a

b

T1 T2

T3

a

b

T1

T2 T3

verso destra

verso sinistra

la proprietà di ricerca è mantenuta

rotazioni negli AVL

casi possibiliq DD: inserimento nel sottoalbero destro di un figlio

destro (del nodo che si sbilancia)q SD: inserimento nel sottoalbero sinistro di un figlio

destro (del nodo che si sbilancia)q DS: inserimento nel sottoalbero destro di un figlio

sinistro (del nodo che si sbilancia)q SS: inserimento nel sottoalbero sinistro di un figlio

sinistro (del nodo che si sbilancia)

rotazione semplice (caso DD)

n gli antenati di P non sono interessati all’inserimento perché in seguito alla rotazione recuperano il loro fattore di bilanciamento precedente

Costo delle operazioni in AVL

n Si dimostra che le rotazioni che si devonoeseguire in seguito ad inseriemnti e/ocancellazioni non alterano il costo di questeoperazioni che e’ sempre uguale ad O(logn) come per la ricerca di un elemento.

Heap e code di priorita’

Coda con prioritàn Una coda con priorità è una struttura dati

dinamica che permette di gestire una collezione di dati con chiave numerica.

n Una coda con priorità offre le operazioni diq inserimento: di un elemento nell’insiemeq massimo: restituisce l’elemento con chiave più

grandeq cancellazione-massimo: restituisce l’elemento

con chiave più grande e lo rimuove dalla collezione

Page 10: Strutture dati - ce.unipr.it · 1 Strutture dati Organizzazione sistematica dei dati e del loro accesso Strutture dati Tipi di dato astratti (strutture dati dinamiche) q Strutture

10

Applicazioni della Coda con Prioritàn Le Code con priorità sono strutture dati molto

comuni in informatica.n Es:

q Gestione di processi: ad ogni processo viene associata una priorità. Una coda con priorità permette di conoscere in ogni istante il processo con priorità maggiore. In qualsiasi momento i processi possono essere eliminati dalla coda o nuovi processi con priorità arbitraria possono essere inseriti nella coda.

n Per implementare una coda con priorità utilizzeremo una struttura dati chiamata heap

heap

n heap = catastan condizione di heap

1. albero binario perfettamente bilanciato2. ogni nodo contiene una chiave maggiore o eguale di

quelle presenti negli eventuali figli

n non memorizza un ordinamento totale q le visite in ampiezza e in pre- in- post-ordine non

forniscono un ordinamento delle chiavi

Heapn Si implementa l’albero tramite un vettore

q Uno heap A ha un attributo heap-size[A] che specifica il numero di elementi contenuto nello heap

q nessun elemento in A[1,length[A]] dopo heap-size[A] è un elemento valido dello heap

q La radice dell’albero è A[1]q L’indice del padre di un nodo di posizione i è i/2q L’indice del figlio sinistro di un nodo i è 2 iq L’indice del figlio destro di un nodo i è 2 i +1q Implemenatzione particolarmente efficiente

n Tempo di ricerca/ordinamenyto in struttura di heap = O(logn)

n Liste collegate

maggio 2002

rappresentazione tramite arrayn ogni nodo v è memorizzato in posizione

p(v)q se v è la radice allora p(v)=0 q se v è il figlio sinistro di u allora p(v)=2p(u)+1q se v è il figlio destro di u allora

p(v)=2p(u)+2

67 68

89

431

66 65

21 5

66 67

4 64

6566671432154

66686789

64

4567891011

3210

12

Coda con priorità con heapn Risulta semplice implementare le varie operazioni di

una coda con priorità utilizzando uno heapq Extract Max: basta restituire la radice dello heapq Heap Extract Max: dopo la restituzione dell’elemento

massimo, posiziona l’ultimo elemento dello heap nella radice ed ripristina la proprietà di ordinamento parziale

q Heap Insert: la procedura inserisce il nuovo elemento come elemento successivo all’ultimo e lo fa salire fino alla posizione giusta facendo “scendere” tutti padri

B-alberi

dizionari in memoria secondaria

Page 11: Strutture dati - ce.unipr.it · 1 Strutture dati Organizzazione sistematica dei dati e del loro accesso Strutture dati Tipi di dato astratti (strutture dati dinamiche) q Strutture

11

B-Alberin I B-Alberi sono una generalizzazione degli

alberi binari di ricercan la principale differenza è che nei B-Alberi

ogni nodo dell’albero può contenere n>2 chiavi

n i B-Alberi sono utilizzati per garantire l’efficienza delle operazioni su insiemi dinamici (ricerca, inserzione e cancellazione) di dati memorizzati su supporti secondari (dischi)

B-Alberin In ogni istante è possibile mantenere in memoria

primaria solo un numero limitato di pagine della memoria secondaria

n le operazioni eseguite sui B-Alberi garantiscono di poter essere eseguite conservando solo un numero costante di pagine in memoria principale (tante più pagine tanto più efficienti saranno le varie operazioni)

n in genere un nodo di un B-Albero e’ tanto grande quanto una pagina di memoria secondaria

Visualizzazione

M

D H Q T X

B C F G J K L N P R S V W Y Z

Esempio n=3127 496

14 83 221 352

128 145 189 222 245 320

521 690

353 354 487

n Notare che le foglie sono ordinate per chiave, da sinistraa destra

B-albero: esempio

Ki Pi Ki+1K1 P1 Kn-1 Pn. . . . . .

K i P i K i+1K 1 P 1 K n-1 P n. . . . . .

n Ogni nodo e' un sequence di coppie [puntatore, chiave]n K1 < K2 < … < Kn-2 < Kn- 1

n P1 punta a un nodo contenente chiavi < K1

n Pi punta a un nodo contenente chiavi in intervallo [Ki-1, Ki)n Pn punta a un nodo contenente chiavi > Kn-1

n Dunque, K ´1 < K ´2 < … < K ´n-2 < K ´n- 1

Inserzionen Per inserire la chiave v, si cerca la foglia dove v

dovrebbe trovarsi: se c’e’ spazio, si inseriscen Se no, si spezza la foglia in due, e si modifica il padre

per prevedere i puntatori alle due foglie

19 --

12 14 17X

15 19

12 14

X15 17

Per inserire la chiave 15• si spezza la foglia• nel padre, [0, 19)diventa [0, 15) e [15, 19)• se il padre e’ pieno, bisognaspezzarlo (in modo simile)• l’albero resta automaticamentebilanciato

Page 12: Strutture dati - ce.unipr.it · 1 Strutture dati Organizzazione sistematica dei dati e del loro accesso Strutture dati Tipi di dato astratti (strutture dati dinamiche) q Strutture

12

Ricercan E’ un operazione simile alla ricerca sugli

alberi binari di ricercan Con la differenza è che non ci sono solo due

vie possibili ad ogni nodo

Grafi

Grafi

n Grafo diretto o orientatoq Insieme N di elementi detti nodi e insieme di archi.

Un arco e’ una coppia ordinata (v,e) di nodi.

n Grafo non oreintatoq Insieme N di elementi detti nodi e insieme di archi.

Un arco e’ una coppia non ordinata (v,e) di nodi.

Grafin I grafi sono strutture dati molto diffuse in informatican Vengono utilizzati per rappresentare reti e

organizzazioni dati complesse e articolaten Per elaborare i grafi in genere è necessario visitarne

in modo ordinato i verticin Vedremo a questo proposito due modi fondamentali

di visita: per ampiezza e per profonditàn Il tempo di esecuzione di un algoritmo su un grafo

G=(V,E) viene dato in funzione del numero di vertici V e del numero di archi E

Grafi

n Se due nodi V1 e V2 sono collegati da un arco si dice che V1 e’ adiacente a V2

n Cammino di un grafo: la sequenza di nodi V1, V2,.. Vn tali che le coppie (V1,V2) ,(V2,V3),.. (Vn-1, Vn) sono adiacenti

n Lunghezza di un cammino: numeor di archipercorsi (o nuemro di nodi -1)

Rappresentazione di un grafon Vi sono due modi per rappresentare un grafo:

q collezione di liste di adiacenzaq matrice di adiacenza

n si preferisce la rappresentazione tramite liste di adiacenza quando il grafo è sparso, cioè con E molto minore di V2

n si preferisce la rappresentazione tramite matrice di adiacenza quando, al contrario, il grafo è denso o quando occorre alta efficienza nel rilevare se vi è un arco fra due vertici dati

Page 13: Strutture dati - ce.unipr.it · 1 Strutture dati Organizzazione sistematica dei dati e del loro accesso Strutture dati Tipi di dato astratti (strutture dati dinamiche) q Strutture

13

Liste di adiacenzan Si rappresenta un grafo G=(V,E) con un

vettore Adj di liste, una lista per ogni vertice del grafo

n per ogni vertice u, Adj[u] contiene tutti i vertici v adiacenti a u, ovvero quei vertici v tali per cui esiste un arco (u,v)∈E

n in particolare questo insieme di vertici è memorizzato come una lista

n l’ordine dei vertici nella lista è arbitrario

Rappresentazioni di grafi. Un grafo (a) rappresentato con una lista di adiacenze (b-c),

Matrici di adiacenza

n Per la rappresentazione con matrici di adiacenza si assume che i vertici siano numerati in sequenza da 1 a V

n Si rappresenta un grafo G=(V,E) con una matrice A=(ai j) di dimensione VxV tale che:aij=1 se (i,j) ∈ Eaij=0 altrimenti Rappresentazioni di grafi. Un grafo (a) rappresentato come una matrice

di adiacenze (d)

Grafi pesati

n In alcuni problemi si vuole poter associare una informazione (chiamata peso) ad ogni arco

n un grafo con archi con peso si dice grafo pesato

n si dice che esiste una funzione peso che associa ad un arco un valore

w : E → R

n ovvero un arco (u,v) ha peso w(u,v)

Visita di un Grafo

n Obiettivo: visitare una sola volta tutti i nodi del grafo.

q Es.: visitare un porzione del grafo del Webn Difficoltà: q Presenza di cicliq Presenza di nodi isolati

Page 14: Strutture dati - ce.unipr.it · 1 Strutture dati Organizzazione sistematica dei dati e del loro accesso Strutture dati Tipi di dato astratti (strutture dati dinamiche) q Strutture

14

Visita in profondità - DFS

n La visita procede da tutti gli archi uscenti da un nodo.

n Se tutti i nodi adiacenti sono stati visitati allora si torna al nodo “predecessore”.

n Una volta tornati al nodo di partenza si prosegue da un nodo qualsiasi non visitato.

n I nodi vengono rinumerati secondo l’ordine di visita.

Implementazione della DFS

n I nodi sono inizialmente marcati con 0, i=0.n Assumi la visita sia arrivata ad un nodo v.n La visita prosegue da un nodo u adiacente a v se

marcato 0.n Se nessun nodo adiacente marcato 0 è disponibile

torna al nodo da cui si è raggiunto v oppure termina se v è il nodo iniziale.

n Ogni volta che un nodo mai visitato è raggiunto, questo viene marcato con i++

Visita in profondità - DFSn visita_profondità(G)q 1. Passo base

se G = Ø f=> esci;q 2. Passo di induzione

visita il nodo G se non è stato visitatoper ogni nodo adiacente G->adj

visita_profondità(G->adj);

n Osservazione: la visita in profondità è strettamente legata alla politica di gestione di uno stack (come tutti gli algoritmiricorsivi);

Implementazione della DFS

n L’implementazione iterativa usa una pila per memorizzare gli archi uscenti da un nodo visitato.

n Ad ogni passo si estrae l’arco (v,u) sulla cima della pila.

n La visita prosegue dal nodo adiacente u se marcato 0.

Esempio di applicazione dell’algoritmo depthFirstSearchad un grafo L’algoritmo depthFirstSearch applicato ad un grafo orientato

Page 15: Strutture dati - ce.unipr.it · 1 Strutture dati Organizzazione sistematica dei dati e del loro accesso Strutture dati Tipi di dato astratti (strutture dati dinamiche) q Strutture

15

Visita in profondità (C)

void visita_profondita(struct nodo_grafo*nodo){if (nodo == NULL) return;if (nodo->flag == 0){printf ("%s\n", nodo->info);nodo->flag = 1;adj = nodo->l_adj;while(adj != NULL){visita_profondita(adj->p_adj);adj = adj->next;}}return;}

Visita in ampiezza - BFS

n uso di una coda per memorizzare tutti gli archi incidenti nel nodo visitato

n I nodi vengono marcati.n La visita quindi procede dall’arco (v,u) in

testa alla coda.

Visita in ampiezza - BFSn visita_ampiezza(G)

per ogni nodo non visitato:q si inserisce il nodo in una coda;q si estrae dalla coda un nodo e si visita;q si inseriscono in coda tutti gli elementi adiacenti al

nodo corrente.

n Osservazione: la visita in ampiezza è strettamente legata alla politica di gestione di una coda;

Un esempio di applicazione dell’algoritmo breadthFirstSearchad un grafo

Applicazione dell’algoritmo breadthFirstSearch ad un grafo orientato

Visita in ampiezza (C)void visita_ampiezza(struct nodo_grafo*nodo){struct punt_adj *adj;static struct p_coda *first_el;coda_ins(nodo);while(first_el != NULL) //finché ci sono elementi nella coda{nodo = coda_extr(); //Estrazione dalla coda di un nodoprintf("nodo->info %c\n", nodo->info); //Visita del nodonodo->flag = 1;adj = nodo->l_adj;while(adj != NULL) //Inserimento in coda dei nodi adiacenti{if (adj->nodo_adj->flag == 0)coda_ins(adj->p_adj);adj = adj->next;} } }