La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Algoritmi Avanzati a.a.2010/2011 Prof.ssa Rossella Petreschi

Presentazioni simili


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

1 Algoritmi Avanzati a.a.2010/2011 Prof.ssa Rossella Petreschi
Algoritmi elementari di ordinamento Lezione n°6 Algoritmi Avanzati a.a.2010/2011 Prof.ssa Rossella Petreschi 1

2 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 AA

3 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 u nel CDE calcoleremo: left(u) = indice dell’unico arco con left(u,v) = 1 right(u) = indice dell’unico arco con right(v,u) = 1 Notare: left(u,v) = right(u,v) = 1 sse v è una foglia. left(r)= 0 AA

4 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 AA

5 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). AA

6 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 AA

7 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 AA

8 Discendenti di un nodo CDE h e c b i a d g f 1 S 2 3 4 5 6 7 8 v a b c
Fatto: Sia dato un albero T con i nodi numerati in postorder. Il numero dei nodi nel sottoalbero radicato in un nodo v (incluso) è dato dalla differenza tra il massimo ed il minimo valore che i nodi in Tv hanno nella numerazione, ovvero è dato dalla differenza del numero di nodi visitati prima di ritornare a p(v) e il numero di nodi visitati prima di raggiungere v. Con la numerazione in postorder il massimo valore in Tv è esattamente quello di Post(v) mentre il minimo può essere trovato in corrispondenza dell’arco (p(v),v). Il numero di discendenti della radice è |Tr| = n per ogni altro nodo il valore è |Tv| = S(v,p(v)) - S(p(v),v) 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 |Tv| 2 1 7 9 4 AA

9 Come ordinare nel Parallelo
Utilizziamo il comparatore, ossia un circuito di confronto con due ingressi e due uscite il cui valore è la coppia di valori in input ordinati in modo ascendente. I circuiti formati da comparatori, se opportunamente combinati, costituiscono un'architettura in grado di ordinare n valori di input. x y min(x,y) max(x,y) 9 5 2 7 9 9

10 Insertion Sort Due architetture per implementare l'insertion sort (tra 8 valori in input): Questa macchina utilizza una versione seriale dell'algoritmo di complessità O(n2) (indicata dalla profondità del circuito, ossia il numero di porte che vengono attraversate in tempi differenti). È possibile ottenere una complessità O(n) ottimizzando lo scheduling dei comparatori e parallelizzando l'algoritmo. 10 10

11 Sulla monotonicità Se un circuito di ordinamento trasforma la sequenza di input a = (a1, a2, …, an) nella sequenza di output b = (b1, b2, …, bn), allora per ogni funzione monotona crescente f, il circuito trasforma la sequenza di input f(a) = (f(a1), f(a2), …, f(an)) nella sequenza di output f(b)=(f(b1), f(b2), …, f(bn)). Tale proprietà è facilmente verificata da un singolo comparatore e per induzione la si può provare per un intero circuito di ordinamento. x y min(x,y) max(x,y) f(x) f(y) min(f(x), f(y))) = f(min(x,y)) max(f(x), f(y))) = f(max(x,y)) 11 11

12 Principio 0/1 Teorema (principio 0/1): se un circuito combinatorio di ordinamento lavora correttamente per qualunque input costruito sull'alfabeto {0,1} allora lavora correttamente per qualunque input costruito su di un qualsiasi alfabeto finito A. Dim: supponiamo per assurdo che il circuito ordini tutte le sequenze costruite sull'alfabeto {0,1} correttamente, ma che esista una sequenza di input di numeri arbitrari a = (a1, a2, …, an) contenente elementi ai e aj tali che ai < aj mentre il circuito pone aj prima di ai nella sequenza di output. Definiamo una funzione f monotona crescente come: f(x) = 0 se x <= ai f(x) = 1 se x > ai dal lemma precedente segue che il circuito sistema f(aj) prima di f(ai) nella sequenza di output quando f(a) è l'input. Ma poiché f(aj) = 1 mentre f(ai) = 0, neghiamo l'ipotesi giungendo ad un assurdo. 12 12

13 Sequenze bitoniche Una Sequenza Bitonica è una sequenza che può essere divisa in due sottosequenze monotone, una crescente e l'altra decrescente o viceversa. Sono bitoniche le due sequenze: m(S) = (min{s1,sn+1}, min{s2,sn+2}, …, min{sn,s2n}) M(S) = (max{s1,sn+1}, max{s2,sn+2}, …, max{sn,s2n}) ottenute dalla sequenza bitonica S = s1, s2, …, s2n Sfruttando la definizione di m(S) ed M(S) e le relative proprietà si può ottenere una definizione ricorsiva per le sequenze bitoniche che ci permette di realizzare un primo algoritmo di ordinamento che opera ricorsivamente secondo lo schema: S = S1 = m(S) = S2 = M(S) = S3 = m(S1) = S4 = M(S1) = S5 = m(S2) = S6 = M(S2) = 8 9 Complessità O(log(n)). 13 13

14 Sequenze pulite Una sequenza binaria si dice pulita se è composta interamente da 0 o da 1. Se S è bitonica almeno una delle due sottosequenze bitoniche m(S) e M(S) è pulita (diretta conseguenza del fatto che la cardinalità di {0,1} è due). In figura è presentato un circuito di ordinamento, di profondità logaritmica, per sequenze 0/1 bitoniche (ad ogni passo rendiamo pulita metà della sequenza). 1 14 14

15 Circuito di fusione Il circuito di fusione fonde due sequenze ordinate costruite sullo stesso alfabeto sfruttando il fatto che, date due sequenze ordinate entrambe crescenti (o decrescenti) x e y, la sequenza che si ottiene concatenando x con z=“y rovesciata” è bitonica (l’inversione della stringa y si realizza semplicemente variando le connessioni). La profondità del circuito è logaritmica e il numero di comparatori ad ogni passo è n/2. 1 15 15

16 Circuito di ordinamento
In figura è riportato un circuito di ordinamento che realizza l’ordinamento connettendo iterativamente diversi circuiti di fusione (la base di questa costruzione sta nel fatto che ogni sequenza di due elementi è bitonica). Poiché concateniamo un numero logaritmico di circuiti di fusione, otteniamo una profondità del circuito O(log2 n). 1 16 16

17 Applicando il teorema di Brent
Il circuito di ordinamento, O, è un circuito combinatorico di profondità d = O(log2 n), di dimensione pari al numero di comparatori c = O(n log2 n), fan in e fan out limitati. Per il Teorema di Brent, l’algoritmo di ordinamento che lavora su O può essere simulato da una algoritmo che lavora su una PRAM EREW con N processori in tempo O(c / p + d), ovvero O((n log2 n) / p + log2 n). Quando p = O(n) si ha che la complessità temporale dell'ordinamento su una PRAM EREW è O(log2 n) e il costo O(n log2 n). 17 17


Scaricare ppt "Algoritmi Avanzati a.a.2010/2011 Prof.ssa Rossella Petreschi"

Presentazioni simili


Annunci Google