Rappresentazione di alberi binari Lezione n°8 Prof.ssa Rossella Petreschi Lezione del 8 /11/2011 del Corso di Algoritmi e Strutture Dati Riferimenti: Paragrafo 4.3 del testo Crescenzi, Gambosi, Grossi “Strutture di dati e algoritmi” Edizioni: Addison Wesley ASD 2011/2012
Numeri di Catalano Il numero di alberi binari distinti con n nodi è pari al numero di Catalano di dimensione n: Cn = (2n su n)/(n+1), risultato dell’equazione ricorsiva Cn = ∑ Cs Cn-s-1, con 0 ≤ s ≤ n-1 e C0= C1=1 C2= 2 C3= 5 C4= 14 C5= 42 …………. ASD 2011/2012 2
Quanti bit per un albero binario? Per rappresentare un qualunque albero binario con n nodi occorrono un numero di bit pari a log Cn= log[(2n su n)/ (n+1)] > > log[(22n)/ (2n(n+1))] per la (*) = 2n - O(logn) (*) (2n su n) = (2n)!/n! (2n-n)! = = (2n/2n) [2n (2n-1) (2n-2)…….1]/[n(n-1)(n-2)…1] [n(n-1)(n-2)…1]) = = (1/2n)[(2n2n)/(nn)][(2n-1)(2n-2)/(n-1)(n-1)]… [3x2/1] > > (1/2n)[(22n2/n2)][(2n-2)(2n-2)/(n-1)(n-1)]… [2x2/1] = = (1/2n) [22n2/n2] [22(n-1)2 /(n-1)2]… [22/12] = (1/2n) x (22n) ASD 2011/2012 3
Rappresentazione di un albero binario Per ogni nodo u, ci soffermiamo su u-padre, u-fs e u-fd Rappresentazione implicita: mantiene u-padre, ufs e ufd (ovvero le relazioni fra i nodi) tramite una semplice regola matematica senza uso di memoria aggiuntiva (a parte quella necessaria ai dati nei nodi, u-info). Esempio: rappresentazione dell’heap Utilizzabile solo per alcune classi di alberi binari Oltre alla rappresentazione necessaria per u-info, usa un numero costante di celle aggiuntive Rappresentazione succinta:rappresentazione che impega una quantità di memoria pari al minimo necessario, a parte termini additivi di ordine inferiore Applicabile ad alberi binari qualunque Oltre alla rappresentazione necessaria per u-info, usa strutture dati che richiedono 2n+o(n)bit aggiuntivi differenziandosi fortemente dalla rappresentazione esplicita che richiede 3nlogn bits aggiuntivi ASD 2011/2012 4
Rappresentazione succinta per ampiezza b a b c d e f 1 1 1 0 1 0 0 1 1 0 0 0 0 nodo[0,…,n-1] pieno[0,…,2n] c d e f Se un nodo occupa la posizione i nell’array nodo, allora i bit corrispondenti ai suoi due figli occupano le posizioni 2i+1 e 2i+2 nell’array pieno Se un nodo occupa la posizione i nell’array nodo, allora pieno[2i+1]=1(pieno[ 2i+2]=1) iff il riferimento al fs (fd) non è null Oltre all’array nodo, dobbiamo conteggiare 2n+1 bits necessari per l’array pieno + lo spazio per navigare fra i due array ASD 2011/2012 5
Come navigare: Rank,Select a b c d e f 1 1 1 0 1 0 0 1 1 0 0 0 0 nodo[0,…,n-1] pieno[0,…,2n]; a b c d Rank(pieno,i): numero di 1 presenti nel segmento pieno[0,i] Select(pieno,i): posizione dell’(i+1)-esimo 1 in pieno e f Identificazione in nodo[] del fs(nodo[i]) o del fd(nodo[i]) : f = 2i+1 (o d = 2i+2 ):posizione del fs (o fd) di i in pieno[]; Rank(pieno,f (oppure d)): numero di 1 presenti nel segmento b[0,f]opure b[0,d]; nodo[Rank(pieno, f (oppure d)) -1]:fs[nodo(i)] oppure fd[nodo(i)]. Identificazione in nodo[] del p(nodo[i]): p = Select (pieno,i): bit 1 corrispondente a nodo[i] in pieno[]; nodo[(p-1)/2]: p[nodo(i)]. ASD 2011/2012 6
Rappresentazione esplicita di Rank Nella rappresentazione esplicita del rank si hanno m interi di logm bit ciascuno , da cui: Spazio: mlogm bit; Tempo: O(1) b(i) 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 ……… i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ……… ---------------------------------------------------------------------------------------- Rank 1 2 3 3 4 4 4 5 6 6 6 6 6 6 6 6 ………. Per ridurre lo spazio, si partiziona il vettore b in segmenti di dimensione k=logm/2 . Per ogni segmento si calcola un solo valore di rango, quindi avremo m/k= m/(logm/2) interi di logm bits ciascuno, da cui: Spazio: mlogm bit; ASD 2011/2012 7
Implementazione di Rank j 1 2 3 4 5 b(i) 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0…… i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20…… ---------------------------------------------------------------------------------------- Rank 1 2 3 3 4 4 4 5 6 6 6 6 6 6 6 6 6 6 6 6 6… Tempo O(1) per conoscere il Rank (=Rank’) degli elementi campionati e per gli altri??? per gli elementi non campionati….. Rank(b,6) = Rank’[1] + #1nei primi 3 elementi di b[4,7] = 3 +1 =4 ASD 2011/2012 8