31
Técnicas Avanzadas de Programación - Javier Campos 39 Análisis en el caso peor El plan: Repaso de conceptos Montículos y el problema de ordenación Árboles rojinegros

red, black tree

Embed Size (px)

Citation preview

Técnicas Avanzadas de Programación - Javier Campos 39

Análisis en el caso peor

• El plan:

– Repaso de conceptos– Montículos y el problema de ordenación– Árboles rojinegros

Técnicas Avanzadas de Programación - Javier Campos 40

TAD Diccionario

• Tipo Abstracto de Datos (TAD):– Definición de un tipo de datos independientemente de

implementaciones concretas – Especificar el conjunto de valores posibles y el

conjunto de operaciones que se utilizan para manipular esos valores

– Definición formal (especificación algebraica)

• TAD Diccionario:– Un TAD que almacena elementos, o valores. A un

valor se accede por su clave. Operaciones básicas: crear, insertar, buscar y borrar.

Técnicas Avanzadas de Programación - Javier Campos 41

Árboles rojinegros

• ¿Para qué sirven?Son una clase de árboles binarios de búsqueda “equilibrados”(altura máxima logarítmica en el número de nodos) para garantizar coste O(log n) de las operaciones básicas del TAD diccionario.

Recordar:- Árboles binarios de

búsqueda (abb)- AVL (abb’s equilibrados)

Técnicas Avanzadas de Programación - Javier Campos 42

Árboles rojinegros

• Definición:– Árbol binario de búsqueda con un bit adicional en

cada nodo, su color, que puede ser rojo o negro.– Ciertas condiciones sobre los colores de los nodos

garantizan que la profundidad de ninguna hoja es más del doble que la de ninguna otra (el árbol está “algo equilibrado”).

– Cada nodo es un registro con: color (rojo o negro), clave (la clave de búsqueda), y tres punteros a los hijos (i, d) y al padre (p). Si los punteros son NIL, imaginaremos que son punteros a nodos “externos” (hojas).

Técnicas Avanzadas de Programación - Javier Campos 43

Árboles rojinegros

• Condiciones rojinegras:RN1 - Cada nodo es rojo o negro.RN2 - Toda hoja (NIL) es negra.RN3 - Si un nodo es rojo, sus dos hijos son negros.

(no puede haber dos rojos consecutivos en un camino)RN4 - Todo camino desde un nodo a cualquier hoja

descendente contiene el mismo número de nodos negros.(cada nodo "real" tiene dos hijos)

• Terminología:– Altura negra de un nodo x, an(x): es el número de nodos negros

desde x (sin incluir x) hasta cualquier hoja descendente de x.– Altura negra de un árbol: la altura negra de su raíz.

Técnicas Avanzadas de Programación - Javier Campos 44

Árboles rojinegros

10

17 41

14 21 30 47

26

16 19 23 28 38

7 12 15 20 35 39

3

NIL NIL

NIL NIL NIL NIL NIL

NIL NIL NIL NIL NIL NIL

NIL NIL NIL NIL

NILNIL

1

1 1 1 1 1 1

2 1 1 1 1 1

1222

3 2

3

NIL NIL

Técnicas Avanzadas de Programación - Javier Campos 45

Árboles rojinegros

• Lema: Todo árbol rojinegro con n nodos internos tiene una altura menor o igual que 2 log(n+1).Demostración:– El subárbol con raíz x contiene al menos 2an(x)-1 nodos

internos. Por inducción en la altura de x:• Caso altura(x)=0: x debe ser una hoja (NIL), y el subárbol

con raíz x contiene en efecto 2an(x)-1 = 20-1 = 0 nodos internos• Paso de inducción: considerar un nodo interno x con dos

hijos; sus hijos tienen altura negra an(x) ó an(x)-1, dependiendo de si su color es rojo o negro, respectivamente. Por hipótesis de inducción, los dos hijos de x tienen al menos 2an(x)-1-1 nodos internos. Por tanto el subárbol con raíz x tiene al menos (2an(x)-1-1)+(2an(x)-1-1)+1= 2an(x)-1 nodos internos.

Técnicas Avanzadas de Programación - Javier Campos 46

Árboles rojinegros

Demostración (cont.):– [El subárbol con raíz x contiene al menos 2an(x)-1

nodos internos (ya demostrado).]– Sea h la altura del árbol.

Por definición (RN3 : si un nodo es rojo, sus dos hijos son negros), al menos la mitad de los nodos de cualquier camino de la raíz a una hoja (sin incluir la raíz) deben ser negros. Por tanto, la altura negra de la raíz debe ser al menos h/2, luego:

n

2h/2-1

log(n+1)

h/2

h

2 log(n+1).

Técnicas Avanzadas de Programación - Javier Campos 47

Árboles rojinegros

• Consecuencias del lema:– Las operaciones de búsqueda pueden implementarse

en tiempo O(log n) para árboles rojinegros con n nodos.

• ¿Y la inserción y el borrado?– Veremos a continuación que también pueden

realizarse en tiempo O(log n) sin que el árbol deje de ser rojinegro.

Técnicas Avanzadas de Programación - Javier Campos 48

Árboles rojinegros

• Rotaciones:– Cambios locales de la estructura de un árbol de

búsqueda que lo mantienen con los mismos datos y preservando las características de árbol de búsqueda.

7

4 11

3 6

2

9 18

14 19

12 17 22

20

x

y

7

4 18

3 6

2

11

9 14

12 17

19

22

20

x

y

rotación_izquierda(x)

Técnicas Avanzadas de Programación - Javier Campos 49

Árboles rojinegrosalgoritmo rota_i(A,x)principioy:=d(x);d(x):=i(y);si i(y)NIL ent p(i(y)):=x fsi;p(y):=p(x);si p(x)=NIL entraíz(A):=y

sinosi x=i(p(x)) enti(p(x)):=y

sinod(p(x)):=y

fsifsi;i(y):=x;p(x):=y

fin

7

4 11

3 6

2

9 18

14 19

12 17 22

20

x

y

7

4 18

3 6

2

11

9 14

12 17

19

22

20

x

y

rotación_izquierda(x)7

4 11

3 6

2

9 18

14 19

12 17 22

20

x

y

7

4 18

3 6

2

11

9 14

12 17

19

22

20

x

y7

4 11

3 6

2

9 18

14 19

12 17 22

20

x

y

7

4 11

3 6

2

9 18

14 19

12 17 22

20

7

4 11

3 6

2

9 18

14 19

12 17 22

20

x

y

7

4 18

3 6

2

11

9 14

12 17

19

22

20

x

y7

4 18

3 6

2

11

9 14

12 17

14

12 17

19

22

20

x

y

rotación_izquierda(x)

La rotación derecha es simétrica.

Técnicas Avanzadas de Programación - Javier Campos 50

Árboles rojinegros

• Inserción:– En primer lugar se realiza una inserción en el árbol de

búsqueda (sin preocuparse del color de los nodos).– Si tras la inserción se viola alguna de las condiciones

RN1-4 , hay que modificar la estructura, usando rotaciones como la anterior y cambiando los colores de los nodos.

– Hipótesis que haremos: la raíz es siempre negra (la implementación que sigue a continuación garantiza que la raíz sigue siendo negra tras la inserción).

Técnicas Avanzadas de Programación - Javier Campos 51

Arboles rojinegrosalgoritmo inserta(A,x)principio1 inserta_abb(A,x);2 color(x):=rojo;3 mq xraíz(A) and color(p(x))=rojo hacer4 si p(x)=i(p(p(x))) ent5 y:=d(p(p(x)));6 si color(y)=rojo ent7 color(p(x)):=negro; 8 color(y):=negro;9 color(p(p(x))):=rojo;10 x:=p(p(x))11 sino 12 si x=d(p(x)) ent x:=p(x); rota_i(A,x) fsi;13 color(p(x)):=negro;14 color(p(p(x))):=rojo;15 rota_d(A,p(p(x)))16 fsi17 sino [igual que arriba, intercambiando i/d]18 fsi19 fmq;20 color(raíz(A)):=negrofin

Inserción

Caso 1

Caso 2

Caso 3

1º) ¿en qué se rompe la def. de árbol r-n en las líneas 1-2?

2º) ¿cuál es el objeto del bucle 3-19?

3º) ¿qué se hace en cada uno de los casos?

Casos 4, 5 y 6

Técnicas Avanzadas de Programación - Javier Campos 52

Arboles rojinegrosalgoritmo inserta(A,x)principio1 inserta_abb(A,x);2 color(x):=rojo;3 mq xraíz(A) and color(p(x))=rojo hacer4 si p(x)=i(p(p(x))) ent5 y:=d(p(p(x)));6 si color(y)=rojo ent7 color(p(x)):=negro; 8 color(y):=negro;9 color(p(p(x))):=rojo;10 x:=p(p(x))11 sino 12 si x=d(p(x)) ent x:=p(x); rota_i(A,x) fsi;13 color(p(x)):=negro;14 color(p(p(x))):=rojo;15 rota_d(A,p(p(x)))16 fsi17 sino [igual que arriba, intercambiando i/d]18 fsi19 fmq;20 color(raíz(A)):=negrofin

Inserción

1º) ¿en qué se rompe la def. de árbol r-n en las líneas 1-2?

RN1 : Cada nodo es rojo o negro.

RN2 : Toda hoja (NIL) es negra.

RN3 : Si un nodo es rojo, sus dos hijos son negros.

RN4 : Todo camino desde un nodo a cualquier hoja descendente contiene el mismo número de nodos negros.

Técnicas Avanzadas de Programación - Javier Campos 53

Arboles rojinegrosalgoritmo inserta(A,x)principio1 inserta_abb(A,x);2 color(x):=rojo;3 mq xraíz(A) and color(p(x))=rojo hacer4 si p(x)=i(p(p(x))) ent5 y:=d(p(p(x)));6 si color(y)=rojo ent7 color(p(x)):=negro; 8 color(y):=negro;9 color(p(p(x))):=rojo;10 x:=p(p(x))11 sino 12 si x=d(p(x)) ent x:=p(x); rota_i(A,x) fsi;13 color(p(x)):=negro;14 color(p(p(x))):=rojo;15 rota_d(A,p(p(x)))16 fsi17 sino [igual que arriba, intercambiando i/d]18 fsi19 fmq;20 color(raíz(A)):=negrofin

Inserción2º) ¿cuál es el objeto del bucle 3-19?

Resolver el problema anterior, como en el caso de la figura (inserción de x rojo, como hijo de otro rojo), haciendo que el color rojo suba hacia la raíz.

x

11

2 14

1 157

5 8

4

Técnicas Avanzadas de Programación - Javier Campos 54

Arboles rojinegrosalgoritmo inserta(A,x)principio1 inserta_abb(A,x);2 color(x):=rojo;3 mq xraíz(A) and color(p(x))=rojo hacer4 si p(x)=i(p(p(x))) ent5 y:=d(p(p(x)));6 si color(y)=rojo ent7 color(p(x)):=negro; 8 color(y):=negro;9 color(p(p(x))):=rojo;10 x:=p(p(x))11 sino 12 si x=d(p(x)) ent x:=p(x); rota_i(A,x) fsi;13 color(p(x)):=negro;14 color(p(p(x))):=rojo;15 rota_d(A,p(p(x)))16 fsi17 sino [igual que arriba, intercambiando i/d]18 fsi19 fmq;20 color(raíz(A)):=negrofin

Inserción

Caso 1

x

y

11

2 14

1 157

5 8

4 Caso 1

11

2 14

1 157

5 8

4

x

3º) ¿qué se hace en cada uno de los casos?

Técnicas Avanzadas de Programación - Javier Campos 55

Arboles rojinegrosalgoritmo inserta(A,x)principio1 inserta_abb(A,x);2 color(x):=rojo;3 mq xraíz(A) and color(p(x))=rojo hacer4 si p(x)=i(p(p(x))) ent5 y:=d(p(p(x)));6 si color(y)=rojo ent7 color(p(x)):=negro; 8 color(y):=negro;9 color(p(p(x))):=rojo;10 x:=p(p(x))11 sino12 si x=d(p(x)) ent x:=p(x); rota_i(A,x) fsi;13 color(p(x)):=negro;14 color(p(p(x))):=rojo;15 rota_d(A,p(p(x)))16 fsi17 sino [igual que arriba, intercambiando i/d]18 fsi19 fmq;20 color(raíz(A)):=negrofin

Inserción

x

y

11

2 14

1 157

5 8

4Caso 2

Caso 2

11

7 14

2 158

51

4

x

Técnicas Avanzadas de Programación - Javier Campos 56

Arboles rojinegrosalgoritmo inserta(A,x)principio1 inserta_abb(A,x);2 color(x):=rojo;3 mq xraíz(A) and color(p(x))=rojo hacer4 si p(x)=i(p(p(x))) ent5 y:=d(p(p(x)));6 si color(y)=rojo ent7 color(p(x)):=negro; 8 color(y):=negro;9 color(p(p(x))):=rojo;10 x:=p(p(x))11 sino12 si x=d(p(x)) ent x:=p(x); rota_i(A,x) fsi;13 color(p(x)):=negro;14 color(p(p(x))):=rojo;15 rota_d(A,p(p(x)))16 fsi17 sino [igual que arriba, intercambiando i/d]18 fsi19 fmq;20 color(raíz(A)):=negrofin

Inserción

Caso 3

x

y11

7 14

2 158

51

4

Caso 3 7

2 11

1 145

4 15

8

Técnicas Avanzadas de Programación - Javier Campos 57

Árboles rojinegros

• Coste de la inserción:– La altura de un árbol r-n con n nodos es O(log n),

luego la “inserción_abb” es O(log n).– El bucle sólo se repite si se cumple el caso 1, y en ese

caso el puntero x sube en el árbol. Por tanto el número máximo de repeticiones del bucle es O(log n).

– Notar, además, que nunca se hacen más de dos rotaciones (el bucle termina si se ejecuta el caso 2 o el 3).

Técnicas Avanzadas de Programación - Javier Campos 58

Árboles rojinegros

• Borrado:– Veremos que también puede hacerse con coste en caso

peor en O(log n).– Para simplificar el algoritmo, usaremos representación

de centinela para el NIL:

nil

negro‘casa’

nil

nil

rojo‘cara’nil

A

negro‘casa’

nil

rojo‘cara’

nil

negro‘nil’nil

nil

negro‘nil’nilnil

negro‘nil’nil

A

Técnicas Avanzadas de Programación - Javier Campos 59

Árboles rojinegros

• Borrado: similar al borrado de un “abb”algoritmo borra(A,z) --z es el puntero al nodo a borrarprincipio1 si clave(i(z))=‘nil’ or clave(d(z))=‘nil’ ent2 y:=z3 sino4 y:=sucesor_abb(z) --el sucesor en inorden de z5 fsi;6 si clave(i(y))‘nil’ ent x:=i(y) sino x:=d(y) fsi;7 p(x):=p(y);8 si p(y)=‘nil’ ent9 raíz(A):=x10 sino11 si y=i(p(y)) ent i(p(y)):=x sino d(p(y)):=x fsi12 fsi;13 si yz ent clave(z):=clave(y) fsi;14 si color(y)=negro ent fija_borrado(A,x) fsifin

Técnicas Avanzadas de Programación - Javier Campos 60

Árboles rojinegros

• Borrado: descripción del algoritmo paso a paso

Líneas 1-5: selección del nodo y a colocar en lugar de z.El nodo y es:

• el mismo nodo z (si z tiene como máximo un hijo), o• el sucesor de z (si z tiene dos hijos)

algoritmo borra(A,z) --z es el puntero al nodo a borrarprincipio1 si clave(i(z))=‘nil’ or clave(d(z))=‘nil’ ent2 y:=z3 sino4 y:=sucesor_abb(z) --el sucesor en inorden de z5 fsi;

. . .

Técnicas Avanzadas de Programación - Javier Campos 61

Árboles rojinegros• Borrado: descripción del algoritmo paso a paso

Línea 6: x es el hijo de y, o es NIL si y no tiene hijos.Líneas 7-12: se realiza el empalme con y, modificando punteros en

p(y) y en x.Línea 13: si el sucesor de z ha sido el nodo empalmado, se mueve el

contenido de y a z, borrando el contenido anterior (en el algoritmo sólo se copia la clave, pero si y tuviese otros campos de información también se copiarían).

. . .6 si clave(i(y))‘nil’ ent x:=i(y) sino x:=d(y) fsi;7 p(x):=p(y);8 si p(y)=‘nil’ ent9 raíz(A):=x10 sino11 si y=i(p(y)) ent i(p(y)):=x sino d(p(y)):=x fsi12 fsi;13 si yz ent clave(z):=clave(y) fsi;

. . .

Técnicas Avanzadas de Programación - Javier Campos 62

Árboles rojinegros

• Borrado: descripción del algoritmo paso a paso

Línea 14: si y es negro, se llama a “fija_borrado”, que cambia los colores y realiza rotaciones para restaurar las propiedades RN1-4 de árbol rojinegro .Si y es rojo las propiedades RN1-4 se mantienen (no se han cambiado las alturas negras del árbol y no se han hecho adyacentes dos nodos rojos).El nodo x pasado como argumento era el hijo único de y antes de que y fuese empalmado o el centinela del NIL si y no tenía hijos.

. . .14 si color(y)=negro ent fija_borrado(A,x) fsifin

Técnicas Avanzadas de Programación - Javier Campos 63

Árboles rojinegros

• Borrado: fijado de propiedades RN1-4– Problema: Si el nodo y del algoritmo anterior era

negro, al borrarlo, todo camino que pase por él tiene un nodo negro menos, por tanto no se cumple RN4

“todo camino desde un nodo a cualquier hoja descendente contiene el mismo número de nodos negros”

para ningún antecesor de y– Solución: interpretar que el nodo x tiene un color

negro “extra”, así “se cumple” RN4 , es decir, al borrar el nodo y “empujamos su negrura hacia su hijo”

– Nuevo problema: ahora el nodo x puede ser “dos veces negro”, y por tanto no verifica RN1

– Solución: aplicar el algoritmo “fija_borrado” para restaurar RN1

Técnicas Avanzadas de Programación - Javier Campos 64

algoritmo fija_borrado(A,x)principio1 mq xraíz(A) and color(x)=negro hacer2 . . .. . . .28 fmq;29 color(x):=negrofin

Árboles rojinegros

• Borrado: fijado de propiedades rojinegras

Objetivo del bucle: mover el “negro extra” hacia arriba hasta que1) x es rojo, y se acaba el problema, o2) x es la raíz, y el “negro extra” se “borra” (él solito)

En el interior del bucle, x es siempre un nodo negro distinto de la raíz y que tiene un “negro extra”.

Técnicas Avanzadas de Programación - Javier Campos 65

Árboles rojinegros

• Interior del bucle:. . .

2 si x=i(p(x)) ent3 w:=d(p(x));4 si color(w)=rojo ent5 color(w):=negro;6 color(p(x)):=rojo;7 rota_i(A,p(x));8 w:=d(p(x))9 fsi; {objetivo: conseguir

. . . un hermano negro para x}

Caso 1

• x es hijo izquierdo• w es el hermano de x• x es “negro doble”

clave(w)

nil (si no, el nº de negros desde p(x) a la hoja w sería menor que desde p(x) a x)

B

A D

EC

x w

D

B E

CA

xnuevo w

Caso 1• w debe tener un hijo negro• se cambia el color de w y p(x)

y se hace “rota_i” con p(x)• el nuevo hermano de x, uno

de los hijos de w, es negro, y se pasa a los otros casos (2-4)

Técnicas Avanzadas de Programación - Javier Campos 66

Árboles rojinegros

• Interior del bucle (cont.):. . .

10 si color(i(w))=negro and color(d(w))=negro ent11 color(w):=rojo;12 x:=p(x)13 sino

. . .

Caso 2

• El nodo w (hermano de x) y los dos hijos de w son negros.• Se quita un negro de x y “otro” de w (x queda con un solo negro y w rojo).• Se añade un negro a p(x).• Se repite el bucle con x:=p(x).• Si se había entrado a este

caso desde el caso 1, el color del nuevo x es rojo y el bucle termina.

Caso 2B

A D

EC

x w

c B

A D

EC

cnuevo x

Técnicas Avanzadas de Programación - Javier Campos 67

Árboles rojinegros

• Interior del bucle (cont.):. . .

14 si color(d(w))=negro ent15 color(i(w)):=negro;16 color(w):=rojo;17 rota_d(A,w);18 w:=d(p(x))19 fsi;

. . .

Caso 3

Caso 3B

A D

EC

x w

c B

A C

D

E

c

nuevo wx

• w y d(w) son negros • i(w) es rojo• Se cambia el color de

w y de i(w) y se hace “rota_d” sobre w.

• El nuevo hermano w de x es ahora negro con hijo derecho rojo, y ese es el caso 4.

Técnicas Avanzadas de Programación - Javier Campos 68

Árboles rojinegros

• Interior del bucle (cont.):. . .

20 color(w):=color(p(x));21 color(p(x)):=negro;22 color(d(w)):=negro;23 rota_i(A,p(x));24 x:=raíz(A)25 fsi26 sino [igual que 3-25, intercambiando i/d]27 fsi

. . .

Caso 4

Caso 4B

A D

EC

x w

c

c’

D

B E

CA

c

c’

• w es negro y d(w) es rojo• Se cambian algunos colores

y se hace “rota_i” sobre p(x) y así se borra el negro “extra” de x.

Técnicas Avanzadas de Programación - Javier Campos 69

Árboles rojinegros

• Coste del borrado:– El coste del algoritmo a excepción de la llamada a

“fija_borrado” es O(log n), porque esa es la altura del árbol.

– En “fija_borrado”, los casos 1, 3 y 4 terminan tras un nº constante de cambios de color y como máximo tres rotaciones.

– El caso 2 es el único que puede hacer repetir el bucle mq, y en ese caso el nodo x se mueve hacia arriba en el árbol como máximo O(log n) veces y sin hacer rotaciones.

– Por tanto, “fija_borrado”, y también el borrado completo, son O(log n) y hacen como mucho tres rotaciones.