Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoDaniele Michelangelo Tarantino Modificato 8 anni fa
1
Algoritmi Avanzati a.a.2011/2012 Prof.ssa Rossella Petreschi L’ausilio delle occorrenze Circuiti di ordinamento Lezione n°5
2
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 AA 2011-2012
3
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. CDEh,ee,hh,cc,bb,cc,ii,aa,dd,aa,ii,gg,ii,cc,ff,cc,h 111 111 1 1 S1012123432321210 left1011011100100100 right1001000110110111 c h g e f b i da AA 2011-2012
4
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 2011-2012
5
vabcdefg inorder1465732 Esempio di visita inorder CDE g,aa,gg,cc,bb,ff,bb,dd,bb,cc,ee,cc,g left101110100100 right100010110111 110011101100 S122234556777 c g a be df AA 2011-2012
6
LCA La computazione del minimo antecedente comune (lca) di ogni nodo si basa sulle seguenti osservazioni: 1. u è antecedente di v sse left(u) < left(v) < right(u) 2. u e v sono confrontabili (nessuno è antecedente dell’altro) sse right(v) < left(u) oppure right(u) < left(v) 3.se u e v sono confrontabili, lca(u,v) è il vertice di livello più basso compreso tra right(u) e left(v) Esempio: CDE h,ee,hh,cc,bb,cc,ii,aa,dd,aa,ii,gg,ii,cc,ff,cc,h S liv 1012123432321210 left1011011100100100 right1001000110110111 lca(a,f)=c right(a) left(f) c h g e f b i da AA 2011-2012
7
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 2 5 7 9 5 9 2 7 2 5 5 7 7 9
8
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(n 2 ) (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.
9
Sulla monotonicità Se un circuito di ordinamento trasforma la sequenza di input a = (a 1, a 2, …, a n ) nella sequenza di output b = (b 1, b 2, …, b n ), allora per ogni funzione monotona crescente f, il circuito trasforma la sequenza di input f(a) = (f(a 1 ), f(a 2 ), …, f(a n )) nella sequenza di output f(b)=(f(b 1 ), f(b 2 ), …, f(b n )). 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(x) f(y)f(y) min(f(x), f(y))) = f(min(x,y)) max(f(x), f(y))) = f(max(x,y))
10
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 = (a 1, a 2, …, a n ) contenente elementi a i e a j tali che a i < a j mentre il circuito pone a j prima di a i nella sequenza di output. Definiamo una funzione f monotona crescente come: f(x) = 0 se x <= a i f(x) = 1 se x > a i dal lemma precedente segue che il circuito sistema f(a j ) prima di f(a i ) nella sequenza di output quando f(a) è l'input. Ma poiché f(a j ) = 1 mentre f(a i ) = 0, neghiamo l'ipotesi giungendo ad un assurdo.
11
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{s 1,s n+1 }, min{s 2,s n+2 }, …, min{s n,s 2n }) M(S) = (max{s 1,s n+1 }, max{s 2,s n+2 }, …, max{s n,s 2n }) ottenute dalla sequenza bitonica S = s 1, s 2, …, s 2n 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 = 1 3 8 9 6 5 5 4 S 1 = m(S) = 1 3 5 4 S 2 = M(S) = 6 5 8 9 S 3 = m(S 1 ) = 1 3 S 4 = M(S 1 ) = 5 4 S 5 = m(S 2 ) = 6 5 S 6 = M(S 2 ) = 8 9 1 3 4 5 5 6 8 9 Complessità O(log(n)).
12
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). 0011100000111000 0000101100001011 0000101100001011 0000011100000111
13
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. 0001001100010011 0000101100001011 0000101100001011 0000011100000111
14
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(log 2 n). 0001001100010011 0000101100001011 0000101100001011 0000011100000111 0010001100100011 0100010101000101 1000011010000110
15
Applicando il teorema di Brent Il circuito di ordinamento, O, è un circuito combinatorico di profondità d = O(log 2 n), di dimensione pari al numero di comparatori c = O(nlog 2 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 p processori in tempo O(c / p + d), ovvero O((n log 2 n) / p + log 2 n). Quando p = O(n) si ha che la complessità temporale dell'ordinamento su una PRAM EREW è O(log 2 n) e il costo O(n log 2 n).
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.