La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi

Presentazioni simili


Presentazione sul tema: "Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi"— Transcript della presentazione:

1 Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi
Lezione n°7 Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi 1

2 Visita in preorder CDE h e c b i a d g f 1 S 2 3 4 5 6 7 8 v a b c d e
Fatto: nella numerazione in preorder (R,FS….FD), ogni nodo v viene numerato la prima volta che viene incontrato durante la visita, ovvero quando si arriva a v dal padre p(v). Dato il CDE di un albero T radicato in r, per ottenere la numerazione dei nodi in preorder sfruttando il Fatto, assegniamo valore 0 ad ogni arco (v,p(v)) che risale dal figlio al padre e valore +1 ad ogni arco (p(v), v) che scende dal padre al figlio. Sulla sequenza così ottenuta eseguiamo poi le somme prefisse. La numerazione in preorder è data da: v = r Pre(v) = 1  v  r Pre(v) = S(p(v),v) +1 Riprendendo l’esempio abbiamo: CDE h e c b i a d g f 1 S 2 3 4 5 6 7 8 v a b c d e f g h i Pre 6 4 3 7 2 9 8 1 5 2

3 Livello di un vertice CDE h e c b i a d g f 1 -1 S 2 3 4 v a b c d e f
Fatto: Il livello di un nodo è quello del padre aumentato di 1, ovvero quello di un figlio diminuito di 1. Per calcolare il livello di ciascun nodo nell’albero assegniamo valore +1 ad ogni arco discendente e valore -1 ad ogni arco ascendente. Eseguite le somme prefisse, si ha: v = r l(v) = 0  v  r l(v) = S(p(v),v) Riprendendo l’esempio abbiamo: CDE h e c b i a d g f 1 -1 S 2 3 4 v a b c d e f g h i l(v) 3 2 1 4

4 Occorrenza sinistra e destra
Anche per individuare la prima e l’ultima occorrenza di un nodo nel CDE di un albero radicato, sfruttiamo il vettore delle somme prefisse S calcolato nello stesso modo del calcolo dei livelli dei nodi. Per ogni arco (u,v) nel CDE calcoleremo: left(e) = 1 sse S(e.pred) < S(e) right(e) = 1 sse S(e.next) < S(e) Per ogni nodo v nel CDE calcoleremo: left(v) = indice dell’unico arco con left(u,v) = 1 right(v) = indice dell’unico arco con right(u,v) = 1 Notare: left(u,v) = right(u,v) = 1 sse v è una foglia. left(r)= 0

5 Esempio left e right Consideriamo l’albero in figura e il suo CDE,radicato nel nodo h h e h c b c i a d a i g c f c h I valori left e right associati all’arco (u,v) identificano rispettivamente la prima e l’ultima visita del nodo v nel Cammino di Eulero. c h g e f b i d a CDE h,e e,h h,c c,b b,c c,i i,a a,d d,a a,i i,g g,i i,c c,f f,c c,h 1 -1 S 2 3 4 left right

6 Visita inorder La visita inorder (FS,R,FD) è definita soltanto su alberi binari, perché è necessario poter distinguere tra figlio sinistro e figlio destro di ogni nodo. Nelle nostre strutture dati non abbiamo tale informazione quindi assumeremo che l’albero abbia la proprietà 0/2 (ciascun nodo ha esattamente 0 o 2 figli). Per ottenere la numerazione inorder ciascuna foglia viene conteggiata in corrispondenza della sua unica occorrenza (left = right = 1) nel CDE, mentre i nodi interni vengono conteggiati nell’occorrenza intermedia tra il primo ed il secondo figlio (left = right = 0). Si da valore 1 a tutti gli archi tali che left = right e si eseguono le somme prefisse S.  v inorder(v) = S(u,v) dove (u,v) è l’arco in cui v è stato conteggiato: left(u,v) = right(u,v).

7 Esempio di visita inorder
c g a b e d f CDE g,a a,g g,c c,b b,f f,b b,d d,b b,c c,e e,c c,g left 1 right S 2 3 4 5 6 7 v a b c d e f g inorder 1 4 6 5 7 3 2

8 LCA CDE Sliv 1 2 3 4 left right c h g e f b i d a lca(a,f)=c
La computazione del minimo antecedente comune (lca) di ogni nodo si basa sulle seguenti osservazioni: u è antecedente di v sse left(u) < left(v) < right(u) u e v sono confrontabili (nessuno è antecedente dell’altro) sse right(v) < left(u) oppure right(u) < left(v) se u e v sono confrontabili, lca(u,v) è il vertice di livello più basso compreso tra right(u) e left(v) Esempio: c h g e f b i d a lca(a,f)=c right(a) left(f) CDE h,e e,h h,c c,b b,c c,i i,a a,d d,a a,i i,g g,i i,c c,f f,c c,h Sliv 1 2 3 4 left right

9 L’operazione di rake Sia T un albero binario 0/2 radicato in r e sia u una foglia in T tale che p(u)  r. L’operazione Rake(u) trasforma T in T' eliminando u e p(u) e unendo il fratello di u al padre del padre. p f u n

10 Se T non è 0/2 Si possono aggiungere tanti nodi quanti ne servono per garantire la proprietà 0/2. Ciò richiede tempo costante con O(n) processori e incremento di occupazione di memoria lineare.

11 L’operazione di Contrazione
Tramite ripetute applicazioni del rake vogliamo ridurre l’albero iniziale T in un albero di tre nodi: la radice e due foglie (quella più a sinistra e quella più a destra in T). Problema: bisogna evitare il rake concorrente di foglie con lo stesso padre o con padri adiacenti per evitare risultati inconsistenti: u u' u u' u u'

12 Soluzione Evitare il rake concorrente di foglie con lo stesso padre: dopo averle numerate da sinistra a destra, si esegue il rake in parallelo su foglie a numerazione alterna. Evitare il rake concorrente di foglie con padri adiacenti: fra le foglie a numerazione alterna selezionate, si eliminano prima quelle che sono figli sinistri e in seguito quelle che sono figli destri. u u' 7 6 6 u u' 7 8

13 Esempio Input: Passo 2.1 rake su q ed l Passo 2.2 rake su t ed p
z d e f r s t o p m g n b i Albero risultante a q z d c e f r s t l o p h m g n b i Passo 2.2 rake su t ed p a s d e f r o g n b i Albero risultante Passo 1 calcola A 1 2 3 4 5 6 7 8 A q s t f l o p n 1 2 3 4 A s f o n Passo 2.3 aggiorna A

14 Esempio Passo 2.1 rake su o Passo 2.1 rake su nulla
Passo 2.2 rake su f Albero risultante e i r Albero risultante d f n b a i a s n b 1 A n Passo 2.3 aggiorna A Passo 2.2 rake su s r Albero risultante Passo 2.1 rake su n e i a f n b r Albero risultante a b Passo 2.2 rake su nulla 1 2 A f n Passo 2.3 aggiorna A Passo 2.3 aggiorna A = 


Scaricare ppt "Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi"

Presentazioni simili


Annunci Google