La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Grafi. giu 03ASD - Grafi2 Definizioni/1 Struttura dati per la rappresentazione di relazioni binarie G=(V,E), |V|=n, |E|=m V: insieme di Vertici E={(v.

Presentazioni simili


Presentazione sul tema: "Grafi. giu 03ASD - Grafi2 Definizioni/1 Struttura dati per la rappresentazione di relazioni binarie G=(V,E), |V|=n, |E|=m V: insieme di Vertici E={(v."— Transcript della presentazione:

1 Grafi

2 giu 03ASD - Grafi2 Definizioni/1 Struttura dati per la rappresentazione di relazioni binarie G=(V,E), |V|=n, |E|=m V: insieme di Vertici E={(v i, v j ): v i, v j V} : insieme di Archi (v i, v j ) = (v j, v i ) = {v j, v i }Grafo semplice (v i, v j ) (v j, v i )Grafo diretto notazione impropria

3 giu 03ASD - Grafi3 Esempi Relazioni di parentela –Alberi genealogici Relazioni tra classi nei linguaggi OO Grafo del Web Assetti societari Reti di trasporto

4 giu 03ASD - Grafi4 Definizioni/2 Multigrafo: E è un multi-insieme Pseudografo: E contiene anche coppie (v i, v i ), dette cappi Cammino (di lunghezza k) in un grafo: v 1, v 2,….., v k : (v i, v i+1 ) E Circuito in un grafo: cammino con v 1 = v k Ciclo in un grafo: circuito con v i v j Grafo pesato: valore reale w k associato ad ogni arco e k

5 giu 03ASD - Grafi5 Definizioni/3 K n : Grafo semplice con n nodi in cui sono presenti tutti gli archi, detto grafo completo –Numero di archi in K n : n(n-1)/2 G = (V, E) sottografo di G = (V, E) se e solo se V V ed E E grado(v): #di archi incidenti in v (v i, v j ) E: v i adiacente a v j

6 giu 03ASD - Grafi6 Esempi di grafi: (a-d) grafi semplici; (c) un grafo completo K4; (e) un multigrafo; (f) uno pseudografo; (g) un circuito in un grafo orientato; (h) un ciclo nel grafo orientato

7 giu 03ASD - Grafi7 Rappresentazioni Liste di adiacenza: ad ogni vertice è associata la lista dei vertici adiacenti –può essere una tabella o una lista concatenata Matrice di adiacenza: a ih = 1 se (v i, v h ) E, a ih = 0 altrimenti Matrice di incidenza: a ih = 1 se v i e h, a ih = 0 altrimenti

8 giu 03ASD - Grafi8 Rappresentazioni di grafi. Un grafo (a) rappresentato con una lista di adiacenze (b-c),

9 giu 03ASD - Grafi9 Rappresentazioni di grafi. Un grafo (a) rappresentato come una matrice di adiacenze (d) e come una matrice dincidenza (e)

10 giu 03ASD - Grafi10 Vantaggi e Svantaggi Lista di adiacenza: memoria O(m) Vantaggi: permette di scorrere i nodi adiacenti a v in O(grado(v)) Svantaggi: inserimenti e cancellazioni su liste concatenate in O(grado(v)) Matrice di adiacenza: memoria O(n 2 ) Vantaggi: Inserimenti e cancellazioni in O(1) Svantaggi: permette di scorrere i nodi adiacenti a v in O(n) D.: matrice di incidenza ?

11 giu 03ASD - Grafi11 Visita di un Grafo Obiettivo: visitare una sola volta tutti i nodi del grafo. –Es.: visitare un porzione del grafo del Web Difficoltà: –Presenza di cicli: marcare i nodi visitati –Presenza di nodi isolati: la visita termina quando sono state considerate tutte le componenti isolate del grafo

12 giu 03ASD - Grafi12 Visita in profondità - DFS La visita procede da ogni nodo finché tutti gli archi adiacenti non sono stati percorsi. Se tutti i nodi adiacenti sono stati visitati allora si torna al nodo predecessore. Una volta tornati al nodo di partenza si prosegue da un nodo qualsiasi non visitato. I nodi vengono numerati secondo lordine di visita.

13 giu 03ASD - Grafi13 Esempio di applicazione dellalgoritmo depthFirstSearch ad un grafo

14 giu 03ASD - Grafi14 Lalgoritmo depthFirstSearch applicato ad un grafo orientato

15 giu 03ASD - Grafi15 Implementazione della DFS/1 I nodi sono inizialmente marcati con 0 Si inizializza i=0 Assumendo che la visita sia arrivata ad un nodo v, essa prosegue attraverso un nodo u adiacente a v, se marcato 0. Se nessun nodo adiacente marcato 0 è disponibile si torna al nodo da cui si è raggiunto v, oppure si termina se v è il nodo iniziale. Ogni volta che viene raggiunto un nodo mai visitato, questo viene marcato con i++ Viene marcato sia linizio che la fine della visita di un nodo v, risp. num(v) e fin(v)

16 giu 03ASD - Grafi16 Implementazione della DFS/2 depthFirstSearch() { for (tutti i vertici v) num(v) = fin(v) = 0; /* Vedi slide seg. */ edges = {}; // insieme vuoto i = j = 1; /* per aggiornare num(v) e fin(v) */ /* main loop */ while ( ) DFS(v); }

17 giu 03ASD - Grafi17 Implementazione della DFS/3 DFS(v) { num(v) = i++; // num(v): prima volta che si visita v for ( ) if (num(u) == 0) { edges = edges {(v, u)}; DFS(u); } fin(v) = j++; // fin(v): ultima volta che si visita v }

18 giu 03ASD - Grafi18 DFS iterativa Limplementazione iterativa della DFS utilizza una pila per memorizzare gli archi uscenti da un nodo visitato. Ad ogni passo si estrae larco (w,v) sulla cima della pila. La visita prosegue su un nodo u adiacente a v (solo se marcato 0). La numerazione fin(v) viene assegnata quando si estrae un arco (w,v) con num(w) < num(v)

19 giu 03ASD - Grafi19 DFS iterativa void iterativeDFS(v) { pila.push((v,v)); // arco fittizio while(!pila.isEmpty()) { (w,v) = pila.pop(); // arco w -> v if (num(v) == 0) { num(v) = i++; edges = edges {(w, v)}; pila.push((w,v)); // prepariamo la II marcatura for ( ) if (num(u) == 0) pila.push((v, u)); } else if (fin(v) == 0) fin(v) = j++;//test inutile? }

20 giu 03ASD - Grafi20 proprietà della DFS lalgoritmo DFS visita lintera componente del grafo raggiungibile dal nodo di partenza se collezioniamo gli archi (edges) che portano alla scoperta di nuovi nodi, otteniamo una collezione di alberi che coprono lintero grafo –un arco viene seguito solo se il nodo adiacente non è mai stato raggiunto. gli archi seguiti connettono un nodo con marca inferiore ad un nodo con marca superiore (forward edges) gli archi che non vengono seguiti al contrario connettono nodi con marca superiore a nodi con marca inferiore (back edges)

21 giu 03ASD - Grafi21 Complessità della DFS O(n) per inizializzare marcatura dei nodi. Test degli archi uscenti da un nodo v: –O(grado(v)) nella rappresentazione con lista di adiacenza. –O(n) nella rappresentazione con matrice di adiacenza. Ogni arco viene testato al più due volte, una volta per ogni estremo Complessivamente O(n + m), O(n 2 ) (grafo denso)

22 giu 03ASD - Grafi22 Ordinamento parziale Ordinamento parziale di un insieme A: relazione d'ordine parziale (transitiva) sugli elementi di A –possono esistere coppie tra le quali non è definito alcun ordine Un grafo diretto aciclico (DAG) rappresenta un ordinamento parziale: l'insieme dei vertici è l'insieme A ed esiste un arco (u, v) sse u < v secondo l'ordine parziale Se esiste un ciclo il grafo non può rappresentare un ordine parziale: perché?

23 giu 03ASD - Grafi23 esempio l'introduzione/eliminazione di archi transitivi non modifica l'ordine parziale descritto chiusura transitiva = aggiunta di tutti gli archi transitivi riduzione transitiva = eliminazione di tutti gli archi transitivi

24 giu 03ASD - Grafi24 Applicazione ordini parziali Ereditarietà tra classi in linguaggi OO Vincoli di precedenza in progetti complessi Contenimento insiemistico Studio di proprietà geometriche...

25 giu 03ASD - Grafi25 esempio slip calzini camicia cintura orologio giacca pantaloni cravatta scarpe

26 giu 03ASD - Grafi26 Ordinamento Topologico/1 Un ordinamento topologico di un DAG è un ordinamento lineare dei suoi vertici che soddisfa la seguente condizione: per ogni arco (u, v) del grafo, u precede v nellordinamento –a ciascun vertice u si assegna un intero p(u) in modo tale che, se esiste l'arco (u, v), allora p(u) < p(v) –di conseguenza, se esiste un cammino da u a w, allora p(u) < p(w): ogni nodo nellordine è seguito da tutti i suoi successori è sempre possibile determinare un ordinamento topologico di un DAG

27 giu 03ASD - Grafi27 Ordinamento Topologico/2 In altre parole si vuole determinare un ordine totale consistente con l'ordine parziale (ce ne possono essere molti!) spesso si usano algoritmi che determinano un ordinamento inverso all'ordinamento topologico –per semplicità, consideriamo anch'essi "topological sorter" Un vertice pozzo è un vertice che non ha archi uscenti. In un DAG esiste sempre almeno un pozzo: perché?

28 giu 03ASD - Grafi28 Ordinamento Topologico/3 TopologicalSort() { for(i = 1; i <= n; i++) { num(v) = i; } sfruttiamo la proprietà che un sottografo di un DAG è un DAG num(·) fornisce la numerazione cercata (inversa)

29 giu 03ASD - Grafi29 Ordinamento topologico: g,e,b,f,d,c,a

30 giu 03ASD - Grafi30 Ordinamento Topologico/4 In pratica un ordinamento topologico (inverso) si ottiene se nella sequenza ogni nodo è seguito dai suoi predecessori (e da altri eventuali nodi) Si esegue una DFS e si ordinano i vertici secondo il valore fin(v). –il valore fin(v) è inferiore a quello dei suoi predecessori Lordinamento topologico si ottiene dalla sequenza ordinata secondo fin(v) scandita in ordine inverso. Come si dimostra?

31 giu 03ASD - Grafi31 Ordinamento Topologico/5 TS(v) num(v) = i++; for( ) if (num(u) == 0) TS(u); else if (fin(u) == 0) errore; // identificato un ciclo /* siamo tornati ad u visitando i successori di u */ /* dopo avere esaminato tutti i predecessori, assegna a v un numero maggiore di quelli assegnati a qualsiasi predecessore */ fin(v) = j++;

32 giu 03ASD - Grafi32 Ordinamento Topologico/6 topologicalSorting(digraph) for( ) num(v) = fin(v) = 0; i = j = 1; while ( ) TS(v); /* conviene "organizzarsi" in anticipo per non dover pagare il costo di un ordinamento */

33 giu 03ASD - Grafi33 Connettività in Grafi diretti Due nodi u,v sono connessi in un grafo orientato se esiste un cammino diretto che collega u a v. Un grafo diretto è fortemente connesso se per ogni coppia u,v, esiste un cammino da u a v. Un grafo è debolmente connesso se ogni coppia di nodi è connessa da un cammino quando gli archi orientati si sostituiscono con archi non orientati.

34 giu 03ASD - Grafi34 Componenti fortemente connesse - SCC/1 Un grafo diretto può essere decomposto in componenti fortemente connesse, V 1, V 2,…, V k, tale che –V = V 1 V 2... V k – u, v V j : u connesso a v, v connesso ad u –V j è un insieme massimale –V i V j = Ø G T = (V, E T ): (u, v) E (v, u) E T

35 giu 03ASD - Grafi35 SCC / 2 StronglyConnectedComponent(G) Esegui DFS(G) per calcolare fin(v) per ogni vertice v; Calcola G T ; Calcola DFS(G T ) considerando i nodi nel "main loop" in ordine decrescente secondo fin(v); Output ogni albero di DFS(G T ) come una componente fortemente connessa separata

36 giu 03ASD - Grafi36 Esempio di esecuzione dellalgoritmo per SCC num/fin 5/4 G 1/5 c 6/8 d 8/6 ab 4/22/3 g 3/1 h 7/7 ef 5 GTGT 4 c 1 d 2 ab 86 g 7 h 3 ef SCC: {a,b,e} {c,d} {f,g} {h} num Radici Alberi DFS: b, c, g, h

37 giu 03ASD - Grafi37 Visita in ampiezza - BFS La visita in ampiezza fa uso di una coda per memorizzare tutti gli archi incidenti nel nodo v visitato che portano ad un nodo marcato 0. I nodi raggiungibili non marcati vengono quindi marcati. La visita procede dallarco (v,u) in testa alla coda.

38 giu 03ASD - Grafi38 Implementazione della BFS breadthFirstSearch() { for (tutti i vertici v) num(v) = 0; edges = {}; // empty set i = 1; while ( ) { num(v) = i++; enqueue(v); while ( ) { v = dequeue(); for ( ) if (num(u) == 0) { num(u) = i++; enqueue(u); edges = edges {(v, u)} } }

39 giu 03ASD - Grafi39 Un esempio di applicazione dellalgoritmo breadthFirstSearch ad un grafo

40 giu 03ASD - Grafi40 Applicazione dellalgoritmo breadthFirstSearch ad un grafo orientato

41 giu 03ASD - Grafi41 Il Problema dei Cammini Minimi G=(V,E) è un grafo pesato sugli archi d(u,v), (u,v) E: peso sullarco (u,v) Cammino dal nodo s al nodo t: v 1, v 2,….., v k : (v i, v i+1 ) E, v 1 = s, v k =t Lunghezza del cammino: Il cammino di lunghezza minima non contiene cicli ……se le distanze sugli archi sono positive. Come si dimostra?

42 giu 03ASD - Grafi42 Il problema dei Cammini Minimi/2 Determinare il cammino di lunghezza minima –dal nodo s al nodo t –dal nodo s a tutti gli altri nodi V (SSSP) –tra tutte le coppie di nodi del grafo (APSP) Numerose applicazioni: reti stradali, reti di comunicazione, scheduling di progetti, progetto di circuiti,….

43 giu 03ASD - Grafi43 Single Source Shortest Paths/1 Consideriamo un grafo pesato con pesi non negativi. Determinare il cammino minimo da un nodo s a tutti i nodi V del grafo Ogni sottocammino di un cammino minimo è esso stesso un cammino minimo. Ex: s,…,i,…j,…,v: cammino minimo da s a v i,…,j è un cammino minimo da i a j. Come si dimostra?

44 giu 03ASD - Grafi44 Single Source Shortest Paths/2 La collezione dei cammini minimi da s a tutti i nodi V forma un albero. Come si dimostra? Algoritmi per SSSP mantengono ad ogni istante delle etichette sui nodi. Etichette rappresentano delle approssimazioni delle distanze dalla sorgente. Vi sono algoritmi che ad ogni passo fissano alcune etichette ai loro valori finali, ex Dijkstra. Altri algoritmi, ex: Bellmann & Ford, possono modificare tutte le etichette lungo lintera esecuzione dellalgoritmo.

45 giu 03ASD - Grafi45 Dijkstra/1 1.Due insiemi di nodi Q ed R. 2.Inizialmente Q= {}, R={1,..,n} 3. 4.Ad ogni passo estrai il nodo v in R con min dist(v) ed inserisci v in Q 5.Per ogni u adiacente a v aggiorna la distanza da s ad u attraverso nodi in Q:

46 giu 03ASD - Grafi46 Unesecuzione di DijkstraAlgorithm

47 giu 03ASD - Grafi47 Dijkstra/2 Ad ogni passo si determina la distanza minima di un nodo v in R. Il nodo viene inserito in Q. Dijkstra termina in n passi. Ad ogni passo occorre determinare il nodo v in R con minimo valore dist(v), O(log n) usando un heap per la coda di priorità. Occorre poi eseguire il rilassamento per ogni adiacente u di v, O(grado(u)) vertici, ed eventualmente aggiornare la priorità. Complessivamente O(m log n) Complessità di Dikstra O((n + m )log n).

48 giu 03ASD - Grafi48 Dijkstra/3 Correttezza: Dimostrare che dist(v) è la distanza minima d(v) da v ad s quando v è incluso in Q. Per assurdo, considera il primo nodo inserito in Q per cui Esiste un cammino alternativo più breve che contiene almeno un nodo in R. Sia v lultimo nodo in R sul cammino da v a s. v è connesso ad s con un cammino formato di soli nodi in Q con dist(v)

49 giu 03ASD - Grafi49 Dijkstra/4 DijkstraAlg(grafo digraph, vertice source) for tutti i vertici v dist(v)= ; dist(source)=0; R = tutti i vertici; while R!=0 v = vertice in R con minimo dist(v); for tutti i vertici u in R adiacenti a v if dist(u)>dist(u)+d(v,u) dist(u)= dist(u)+d(v,u; pred(u) = v;

50 giu 03ASD - Grafi50 Dijkstra/5 La collezione dei pred(u) forma lalbero dei cammini minimi con sorgente s. Si può risolvere il problema APSP eseguento n volte Dijkstra a partire da n sorgenti. Complessità:O(nlog n(m +n)).

51 giu 03ASD - Grafi51 Minimo Albero Ricoprente – MST Si desidera selezionare un sottografo di un grafo che mantenga la connettività tra tutti i nodi al minore costo possibile. Ex: selezionare un sottoinsieme di tratte aeree che permettono di raggiungere tutte le destinazioni con costo minimo. Assumiamo un grafo semplice e pesi non negativi d(u,v) sugli archi. La rete ottima è un albero. Perché?

52 giu 03ASD - Grafi52 a b h cd g e f i Il Minimum Spanning Tree di un Grafo

53 giu 03ASD - Grafi53 MST / 2 Strategie Greedy: procedi attraverso una sequenza di scelte ottime locali. Strategie greedy convergono alla soluzione ottima solo in casi particolari. Per il MST, consideriamo algoritmi che mantengono la seguente proprietà: P1. Ad ogni passo linsieme degli archi selezionati è un sottoinsieme del MST finale. Ad ogni passo un nuovo arco viene aggiunto alla soluzione mantenendo P1

54 giu 03ASD - Grafi54 MST / 3 Definiamo un arco safe se può essere aggiunto ad un MST mantenendo P1 Il generico algoritmo Greedy: Algorithm_MST(G,d) A={} while A non è uno Spanning Tree trova un arco (u,v) safe per A;/* Safe Inserisci (u,v) in A; return A Diversi algoritmi differiscono per la strategia di ricerca di un arco safe. Questo algoritmo ha n-1 iterazioni

55 giu 03ASD - Grafi55 Archi safe Una partizione S, V/S dei vertici rispetta un insieme di archi A se Larco (u,v) di peso minimo che attraversa il taglio S, cioè è safe per A Si dimostra che esiste un MST che include sia A che (u,v)

56 giu 03ASD - Grafi56 Prova Per assurdo, assumi che un MST T include A ma non include (u,v). Considera il taglio (S, V/S) per cui (u,v) è safe. Vi è un arco in T che attraversa il taglio (S, V/S). (u,v) forma un ciclo in T con (x,y). Poiché d(u,v)<=d(x,y) T = T /(x,y) (u,v) ha costo minore.

57 giu 03ASD - Grafi57 Algoritmo di Boruvka Linsieme A forma un insieme di componenti connesse Safe: Determina larco di costo minimo che connette due componenti connesse in A. I pesi degli archi vengono memorizzati in una coda di priorità. Ad ogni passo si estrae il minimo e si eliminano anche tutti gli archi tra due componenti che vengono unite. Complessità: O(m log n). m eliminazioni da un heap.

58 giu 03ASD - Grafi58 a b h c d g e f i a b h cd g e f i Esecuzione dellAlgoritmo di Boruvka La numerazione indica lordine di selezione degli archi del MST

59 giu 03ASD - Grafi59 Algoritmo di Kruskal Ordina gli archi secondo peso crescente Safe: Determina larco di peso minimo che non induce cicli in A. Complessità: –Ordinamento degli archi in O(m log m). –Verifica m volte se si ha un ciclo. Determinare lesistenza di un ciclo può essere svolto in O(log n) utilizzando una struttura dati per insiemi disgiunti Lesecuzione sullesempio è identica allalgoritmo di Boruvska

60 giu 03ASD - Grafi60 Gestione di insiemi/1 Ogni insieme ha uno dei suoi elementi come rappresentante. Lelemento rappresentante non viene modificato finchè linsieme non viene modificato. Operazioni: –Make-Set(x): costruisce insieme di un elemento con rappresentante lelemento stesso –Union(x,y): unisce due insiemi con rappresentanti x ed y. –Find-Set(x): restituisce il rappresentante dellinsieme contenente x.

61 giu 03ASD - Grafi61 Gestione di Insiemi/2 Sequenza di m operazioni su elementi implementabili in tempo O(m+n log n) con foreste di insiemi disgiunti. Ogni elemento è un nodo di un albero. Ogni insieme è un albero distinto il cui rappresentante è il nodo alla radice. Make-Set(x): nuovo albero con nodo. Find-Set(x): risali lalbero contente x fino alla radice. Union(x,y): albero con minor numero di nodi viene appeso alla radice dellaltro. Union-by-weight.

62 giu 03ASD - Grafi62 Algoritmo di Kruskal MST-Kruskal(G,w) A=0; Ordina E in ordine non decrescente; Per ogni secondo lordine If Find-Set(u)<>Find-Set(v) then A=A {(u,v)}; Union(u,v}; Return A

63 giu 03ASD - Grafi63 Algoritmo di Prim / 1 Linsieme A forma ad ogni passo una singola componente connessa Inizialmente A contiene {u,v} tale che (u,v) è larco di costo minimo. Ad ogni passo si inserisce in A larco di costo minimo che attraversa il taglio A, V/A.

64 giu 03ASD - Grafi64 Algoritmo di Prim /2 Limplementazione di Prim è simile a Dijkstra con Q=A. Un Heap R memorizza il peso minimo di un arco che connette un nodo di R ad un nodo di A. Ad ogni passo un nodo v di minima priorità è inserito in A (e rimosso dallHeap R) Per tutti i nodi u in R adiacenti a v si aggiorna la priorità di u se d(v,u) è minore della priorità corrente di u. Complessità: O(m log n) per laggiornamento della priorià che può essere svolta m volte.

65 giu 03ASD - Grafi65 Algoritmo di Prim / 3 PrimAlg(grafo graph, vertice s) A = {s}; R = tutti i vertici/s; for tutti i vertici v rank(v)=min{d(s,v), }; while R!=0 estrai vertice v in R con minimo rank(v)=d(r,v), ; A = A v; pred(v) = r; for tutti i vertici u in R adicacenti ad v if rank(u)>d(v,u) rank(u) = d(v,u);

66 giu 03ASD - Grafi66 a b h c d g e f i a b h cd g e f i Esecuzione dellAlgoritmo di Prim La numerazione indica lordine di selezione degli archi del MST

67 giu 03ASD - Grafi67 Esempio di compito dEsame 1.Indicare un esempio di caso peggiore per lalgoritmo di Quicksort. 2.Scrivere un metodo per il calcolo del predecessore in un albero binario di ricerca. 3.Risolvere la seguente ricorrenza: T(n)=3T(n/2)+n 4.Mostrare linserimento di un elemento in un dato albero AVL. 5.Illustrare lesecuzione dellalgoritmo per lordinamento topologico su un dato ordine parziale.


Scaricare ppt "Grafi. giu 03ASD - Grafi2 Definizioni/1 Struttura dati per la rappresentazione di relazioni binarie G=(V,E), |V|=n, |E|=m V: insieme di Vertici E={(v."

Presentazioni simili


Annunci Google