La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Ricerca di una chiave: Search(x, k) if x == nil or k == x.key return x if k < x.key return Search(x.left, k) else return Search(x.right, k) Complessità

Presentazioni simili


Presentazione sul tema: "Ricerca di una chiave: Search(x, k) if x == nil or k == x.key return x if k < x.key return Search(x.left, k) else return Search(x.right, k) Complessità"— Transcript della presentazione:

1 Ricerca di una chiave: Search(x, k) if x == nil or k == x.key return x if k < x.key return Search(x.left, k) else return Search(x.right, k) Complessità O(h) dove h è laltezza dellalbero.

2 Si può anche fare iterativa: Search(x, k) while x nil and k x.key if k < x.key x = x.left else x = x.right return x Complessità O(h) dove h è laltezza dellalbero.

3 Ricerca del minimo e del massimo: Minimum(x) // x nil while x.left nil x = x.left return x Complessità O(h) dove h è laltezza dellalbero. Maximum(x) // x nil while x.right nil x = x.right return x

4 Ricerca di successivo e precedente Successor(x) if x.right nil return Minimum(x.right) y = x.p while y nil and x == y.right x = y, y = y.p return y Complessità O(h) dove h è laltezza dellalbero. Il precedente si ottiene cambiando right in left e Minimum in Maximum.

5 Inserzione di un nuovo elemento Insert(T, z) // z.left = z.right = nil x = T.root, y = nil // y padre di x while x nil // cerco dove mettere z y = x if z.key < y.key x = y.left else x = y.right z.p = y // metto z al posto della foglia x if y == nil T.root = z elseif z.key < y.key y.left = z else y.right = z Complessità O(h) dove h è laltezza dellalbero.

6 Eliminazione di un elemento: Delete(T, z) // z nil if z.left == nil or z.right == nil // tolgo z y = z // che ha al più un solo figlio else // tolgo il successore di z che non ha // sottoalbero sinistro y = Successor(z), z.key = y.key // cerco leventuale unico figlio x di y if y.left == nil x = y.right else x = y.left

7 // metto x al posto di y if x nil x.p = y.p if y.p == nil T.root = x elseif y == y.p.left y.p.left = x else y.p.right = x Complessità O(h) dove h è laltezza dellalbero.

8 Alberi rosso-neri Le operazioni sugli alberi binari di ricerca hanno complessità proporzionale allaltezza h dellalbero. Gli alberi rosso-neri sono alberi binari di ricerca in cui le operazioni Insert e Delete sono opportunamente modificate per garantire unaltezza dellalbero h = O(log n) Bisogna aggiunge un bit ad ogni nodo: il colore che può essere rosso o nero.

9 Oltre ad essere alberi binari di ricerca, gli alberi rosso-neri soddisfano le proprietà: 1.ogni nodo è o rosso o nero; 2.la radice è nera; 3.le foglie (nil) sono tutte nere; 4.i figli di un nodo rosso sono entrambi neri; 5.per ogni nodo x i cammini da x alle foglie sue discendenti contengono tutti lo stesso numero bh(x) di nodi neri: laltezza nera di x; Notare che il nodo x non viene contato in bh(x) anche se è nero.

10 Esempio di albero rosso-nero:

11 c nil g be a f d

12 E utile usare una sentinella al posto di nil ?

13 cgbeafd? T.nil

14 Proprietà: Un albero rosso-nero con n nodi interni ha altezza h 2 log 2 (n+1) Dimostrazione: Osserviamo che i nodi rossi in un cammino dalla radice r alle foglie possono essere al più bh(r) e quindi h 2 bh(r). Basta quindi dimostrare che bh(r) log 2 (n+1) ossia che n 2 bh(r) - 1

15 Dimostriamo n 2 bh(r) – 1 per induzione sulla struttura dellalbero rosso-nero. Se T = Ø la radice r è una foglia, bh(r) = 0 e n = 0 = 2 bh(r) – 1

16 Sia T = (r,T 1,T 2 ) e siano r 1 ed r 2 le radici di T 1 e T 2 ed n 1 ed n 2 il numero di nodi interni di T 1 e T 2. Allora: bh(r 1 ) bh(r)-1 bh(r 2 ) bh(r)-1 n = 1+ n 1 + n 2 Per ipotesi induttiva

17 Conseguenza: Su di un albero rosso-nero con n nodi interni le operazioni Search, Minimum, Maximum, Successor e Predecessor richiedono tutte tempo O(log n)

18 Anche le operazioni Insert e Delete su di un albero rosso-nero richiedono tempo O(log n) ma siccome esse modificano lalbero possono introdurre delle violazioni alle proprietà degli alberi rosso-neri ed in tal caso occorre ripristinare le proprietà. Per farlo useremo delle operazioni elementari, dette rotazioni, che preservano la proprietà di albero binario di ricerca.

19 Left-Rotate(T, x) y = x.right // y non deve essere la sentinella T.nil x.right = y.left, y.left.p = x // y.left può essere T.nil y.p = x.p if x.p == T.nil T.root = y elseif x == x.p.left x.p.left = y else x.p.right = y x.p = y, y.left = x Left-Rotate(T, x) Complessità (1) x y x y

20 Right-Rotate(T, y) x = y.left // x non deve essere la sentinella T.nil y.left = x.right, x.right.p = y // x.right può essere T.nil x.p = y.p if y.p == T.nil T.root = x elseif y == y.p.left y.p.left = x else y.p.right = x y.p = x, x.right = y Right-Rotate(T, y) Complessità (1) x y x y


Scaricare ppt "Ricerca di una chiave: Search(x, k) if x == nil or k == x.key return x if k < x.key return Search(x.left, k) else return Search(x.right, k) Complessità"

Presentazioni simili


Annunci Google