Algoritmi Avanzati Prof.ssa Rossella Petreschi Ear Decomposition Lezione n°10 Algoritmi Avanzati Prof.ssa Rossella Petreschi 1
Ear Decomposition Dato un grafo non orientato G e P0 ciclo semplice in G, una Ear Decomposition è una partizione ordinata dell’insieme degli archi E = P0P1P2…Pk tale che 1ik Pi è un cammino semplice in cui entrambi gli estremi (e solo gli estremi) appartengono a P0…Pi-1. Non è unica: Se 1ik Pi non è un ciclo (gli estremi sono distinti) allora la decomposizione si dice aperta (vedi secondo esempio). P0 P1 P2 P3 P0 P1 P2 P3 P0
Quali grafi ammetto una Ear Decomposition? G è privo di ponti EAR Decomposition G è biconnesso EAR Decomposition aperta SI P0 P1 NO P0 P1 P2 P3
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. 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. 4 3 1 2 5 8 9 6 7 e2 e3 4 3 1 2 5 8 9 6 7 e1 e6 e4 e7 e8 e10 e9 e5
label(e) = <level(lca(u,v)),e> 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. eT label(e) (3,2) <0,e8> (3,4) <0,e2> (4,1) (4,8) <1,e4> (4,5) (8,9) (9,7) (5,6) eT lca label(e) (2,1) 3 <0,e8> (1,8) 4 <1,e9> (3,5) <0,e2> (7,8) 8 <2,e10> (7,6) <1,e4>
Risultato Ordinando gli archi rispetto a label(e) si ottiene la Ear Decomposition come sequenza ordinata di cammini disgiunti. e label(e) (4,5) <0,e2> (3,5) (3,4) (4,1) <0,e8> (3,2) (2,1) (8,9) <1,e4> (5,6) (9,7) (7,6) (4,8) (1,8) <1,e9> (7,8) <2,e10> 4 3 1 2 5 8 9 6 7 Pe2 Pe2 Pe8 Pe8 Pe9 Pe4 Pe10 Pe4 Pe9 Pe10
Calcolo di label(e) eT Dopo aver calcolato label(e) e T si definisca: f(v) = min{label(v,u) : (v,u) T} vT È 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) log2 n) su PRAM CREW.
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) vT 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
Analisi La costrizione dello ST (dando costo 1 a tutti gli archi) costa O(n2 log2 n) su PRAM CREW. 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. Il calcolo del lca con la tecnica del TDE richiede un costo pari a O(n log n) su PRAM EREW. (*) Il calcolo di label(e) eT si è visto che costa O((n+m) log2n) su PRAM CREW. L’ordinamento richiede O(n log n) su PRAM EREW. La complessità totale dell’algoritmo è pari a quella del calcolo dello ST O(n2 log2 n) su PRAM CREW