Ear Decomposition Lezione n 13 Algoritmi Avanzati a









- Slides: 9
Ear Decomposition Lezione n° 13 Algoritmi Avanzati a. a. 2011/2012 Prof. ssa Rossella Petreschi
Ear Decomposition Dato un grafo non orientato G e P 0 ciclo semplice in G, una Ear Decomposition è una partizione ordinata dell’insieme degli archi E = P 0 P 1 P 2 … Pk tale che 1 i k Pi è un cammino semplice in cui entrambi gli estremi (e solo gli estremi) appartengono a P 0 … Pi-1. Non è unica: P 3 P 2 P 0 P 1 P 0 Se 1 i k Pi non è un ciclo (gli estremi sono distinti) allora la decomposizione si dice aperta (vedi secondo esempio). AA 2011 -2012 P 3 P 2
Quali grafi ammetto una Ear Decomposition? G è privo di ponti EAR Decomposition P 0 P 1 NO SI G è biconnesso EAR Decomposition aperta P 2 P 1 P 3 P 0 AA 2011 -2012
Ear e Spanning Tree Dato G si consideri un suo spanning tree T. Esistono m-n+1 archi di G non in T, ciascuno dei quali induce un ciclo se viene aggiunto a T. 3 e 1 2 e 8 e 2 3 e 7 1 4 e 9 5 e 3 2 6 e 6 4 e 4 8 e 10 9 7 e 5 1 5 8 6 9 7 Questa è una copertura del grafo tramite cicli, non una Ear Decomposition: infatti due cicli possono condividere degli archi. È necessario “rompere” i cicli per ottenere una Ear Decomposition. AA 2011 -2012
Etichettare gli archi Etichettiamo ogni arco e=(u, v) in G-T nel seguente modo: label(e) = <level(lca(u, v)), e> Livello e lca sono da intendersi in T, aggiungiamo l’indice dell’arco per disambiguare ed avere tutte etichette distinte. Poi etichettiamo gli archi in T assegnando a ciascun arco e=(u, v) in T la minima etichetta associata ad una arco e' non in T che induce un ciclo contente e. e T label(e) e T (2, 1) (1, 8) (3, 5) (7, 8) (7, 6) lca 3 4 3 8 4 label(e) <0, e 8> <1, e 9> <0, e 2> <2, e 10> <1, e 4> AA 2011 -2012 (3, 2) (3, 4) (4, 1) (4, 8) (4, 5) (8, 9) (9, 7) (5, 6) <0, e 8> <0, e 2> <0, e 8> <1, e 4> <0, e 2> <1, e 4>
Risultato Ordinando gli archi rispetto a label(e) si ottiene la Ear Decomposition come sequenza ordinata di cammini disgiunti. e (4, 5) (3, 4) (4, 1) (3, 2) (2, 1) (8, 9) (5, 6) (9, 7) (7, 6) (4, 8) (1, 8) (7, 8) label(e) <0, e 2> <0, e 8> <1, e 4> <1, e 4> <1, e 9> <2, e 10> 3 Pe 2 Pe 8 Pe 2 2 4 1 Pe 9 5 8 6 Pe 4 Pe 9 Pe 10 AA 2011 -2012 Pe 10 9 7 Pe 4
Calcolo di label(e) e T Dopo aver calcolato label(e) e T si definisca: f(v) = min{label(v, u) : (v, u) T} v T È possibile verificare che per ogni arco e=(v, p(v)) T il valore label(e) sarà il minimo valore f(u) tra i nodi u appartenenti al sottoalbero Tv radicato in v. Il calcolo del minimo nel sottoalbero si può realizzare, tramite la tecnica del salto del puntatore, in tempo O(log n) su una PRAM CRCW (con scrittura del valore minimo) con n processori. L’assegnamento di f(v) v richiede O(1) e m processori sullo stesso modello. Il costo è quindi O((n+m) log n) su PRAM CRCW o, simulando la scrittura concorrente, O((n+m) log 2 n) su PRAM CREW. AA 2011 -2012
Algoritmo Ear Decomposition Input: G privo di ponti rappresentato come sequenza di archi begin T = spanning tree di G calcola TDE; radica T in qualunque nodo; calcola level(v) v T for each e=(u, v) T pardo Pe: calcola lca(u, v) label(e) = <level(lca(u, v)), e> for each e T pardo Pe: label(e) = min{ label(e') : e' T e ciclo indotto da e' in T } ordina gli archi rispetto a label(e) end AA 2011 -2012
Analisi 1. La costrizione dello ST (dando costo 1 a tutti gli archi) costa O(n 2 log 2 n) su PRAM CREW. 2. Il calcolo del TDE, il radicamento dell’albero e il calcolo del livello per ogni nodo richiedono un costo O(n log n) su PRAM EREW. 3. Il calcolo del lca con la tecnica del TDE richiede un costo pari a O(n log n) su PRAM EREW. (*) 4. Il calcolo di label(e) e T si è visto che costa O((n+m) log 2 n) su PRAM CREW. 5. L’ordinamento richiede O(n log n) su PRAM EREW. La complessità totale dell’algoritmo è pari a quella del calcolo dello ST: O(n 2 log 2 n) su PRAM CREW (*) Abbiamo visto esplicitamente come calcolare il lca di una singola coppia di nodi in tempo log n con n processori su PRAM EREW. Precalcolando opportune strutture dati per trovare il minimo in ogni intervallo di un vettore (Range Minimum Query) ogni processore può calcolare il lca di una coppia di nodi in tempo costante su PRAM CREW. AA 2011 -2012