Вы находитесь на странице: 1из 26

Estructuras de Datos / Arboles B

Gilberto Gutiérrez
Departamento de Ciencias de la Computación y TI
Universidad del Bı́o-Bı́o
Chillán / Chile

Otoño 2017

rea la diapositiva
Gilberto de presentacin
Gutiérrez (UBB) June 1, 2017 1 / 26
Contenido

1 Introducción
Definiciones

2 Operaciones
Creación
Búsqueda
Inserción
Eliminación

3 Variantes
Arbol B+ /B+ −tree

Gilberto Gutiérrez (UBB) June 1, 2017 2 / 26


Ejemplo de un B−tree

Ejemplo

Gilberto Gutiérrez (UBB) June 1, 2017 3 / 26


Definición de un B−tree

Propiedades de un B−tree con raı́z root[T ]


1 Cada nodo x tiene los siguientes atributos
(a) n[x], número de claves almacenadas en el nodo x
(b) las n[x] claves se encuentran ordenadas de manera ascendente, es decir,
key1 [x] ≤ key2 [x], . . . , ≤ keyn [x]
(c) leaf [x] (TRUE si x es una hoja (leaf) y FALSE si es un nodo interno
(internal node))
2 cada nodo interno contiene n[x] + 1 punteros
c1 [x], c2 [x], . . . , cn[x]+1 [x] a sus “hijos”. Para los nodos hojas los ci se
encuentran indefinidos
3 Las claves keyi [x] separan el rango de claves en cada subárbol. Si ki
es cualquiera de las claves almacenadas en el subárbol apuntado por
ci [x], entonces k1 ≤ key1 [x] ≤ k2 ≤ key2 [x], . . . , keyn[x] [x] ≤ kn[x]+1
4 Todas las hojas se encuentran a la misma profundidad

Gilberto Gutiérrez (UBB) June 1, 2017 4 / 26


Definición de un B−tree (cont.)

Propiedades de un B−tree con raı́z root[T ] (cont)


5 Existe un lı́mite superior y uno inferior para la cantidad de claves que se
pueden almacenar en un nodo, los cuales se expresan en términos de un
entero fijo t ≥ 2 llamado el grado mı́nimo de un B−tree . . .
(a) Cada nodo diferente a la raı́z debe contener al menos t − 1 claves y al
menos t hijos. Si el árbol no está vacio, la raı́z debe tener al menos 1
clave.
(b) Cada nodo puede contener a lo más 2t − 1 claves. Por lo tanto cada nodo
puede tener 2t hijos. Un nodo está lleno si contiene exactante 2t − 1
claves

Gilberto Gutiérrez (UBB) June 1, 2017 5 / 26


Operaciones básicas sobre un B−tree

Operaciones
Creación
Búsqueda
Inserción
eliminación

Supuestos
El nodo raı́z siempre se encuentra en RAM
DISK-READ() − accesa y trae a RAM un nodo (bloque/página).
Cualquier nodo que se pasa como parámetro debe haber hecho un
DISK-READ.
DISK-WRITE() − Graba la información de un nodo en el disco.

Gilberto Gutiérrez (UBB) June 1, 2017 6 / 26


Creación de un B−tree vacio

Creación
1: B-TREE-CREATE(T )
2: x ← ALLOCATE-NODE()
3: leaf [x] ← TRUE
4: n[x] ← 0
5: DISK-WRITE(x)
6: root[T ] ← x

Requiere de O(1) accesos a bloques

Gilberto Gutiérrez (UBB) June 1, 2017 7 / 26


Búsqueda de una clave en un B−tree

Búsqueda
Similar a la búsqueda en un árbol de búsqueda binaria, pero en lugar
de elegir entre 2 vias, se debe elegir entre varias
El procedimiento retorna el nodo donde se encuentra la clave y la
posición dentro del nodo o NIL en otro caso
La llamada al procedimiento debe ser B-TREE-SEARCH(root[T], k).

Gilberto Gutiérrez (UBB) June 1, 2017 8 / 26


Búsqueda de una clave en un B−tree

Búsqueda
1: B-TREE-SEARCH(x, k)
2: i ←1
3: while i ≤ n[x] and k > keyi [x]
4: do i ← i + 1
5: if i ≤ n[x] and k = keyi [x]
6: then return (x, i )
7: if leaf [x]
8: then return NIL
9: else DISK-READ(ci [x])
10: return B-TREE-SEARCH(ci [x], k)

El número de bloques accesados por B-TREE-SEARCH() es


O(h) = O(logt n)

Gilberto Gutiérrez (UBB) June 1, 2017 9 / 26


Inserción de una clave en un B−tree

Mucho más complicado que en un AVL, ya que al insertar una clave en un


nodo este puede estar lleno y necesitamos dividirlo (split)

Split de un nodo
Consiste en dividir un nodo y (2t − 1 claves) en torno a su mediana
keyt [y ], dejando en cada nodo t − 1 claves. La mediana se mueve hacia el
padre de y para indicar el punto de división entre los nuevos árboles. Pero
si el padre de y está lleno, entonces éste se debe dividir (split) también
antes que la nueva clave sea insertada. Esto provoca que una clave se
propague hacia la raı́z del árbol.

Gilberto Gutiérrez (UBB) June 1, 2017 10 / 26


Split de un nodo lleno de un B−tree

t=4

Gilberto Gutiérrez (UBB) June 1, 2017 11 / 26


Split de un nodo lleno de un B−tree
1: B-TREE-SPLIT-CHILD(x, i , y )
2: z ← ALLOCATE-NODE()
3: leaf [z] ← leaf [y ]
4: n[z] ← t − 1
5: for j ← 1 to t − 1 do keyj [z] = keyj+t [y ]
6: if not leaf [y ]
7: then for j ← 1 to t do cj [z] = cj+t [y ]
8: n[y ] ← t − 1
9: for j ← n[x] + 1 downto i + 1 do cj+1 [x] = cj [x]
10: ci +1 [x] ← z
11: for j ← n[x] downto i do keyj+1 [x] = keyj [x]
12: keyi [x] ← keyt [y ]
13: n[x] ← n[x] + 1
14: DISK-WRITE(y )
15: DISK-WRITE(z)
16: DISK-WRITE(x)
Gilberto Gutiérrez (UBB) June 1, 2017 12 / 26
Insertando una clave en un B−tree

Gilberto Gutiérrez (UBB) June 1, 2017 13 / 26


Insertando una clave en un B−tree

1: B-TREE-INSERT(T ,k)
2: r ← root(T )
3: if n[r ] = 2t − 1
4: then s ← ALLOCATE-NODE()
5: root[T ] ← s
6: leaf [s] ← FALSE
7: n[s] ← 0
8: c1 [s] ← r
9: B-TREE-SPLIT-CHILD(s, 1, r )
10: B-TREE-INSERT-NONFULL(s, k)
11: else B-TREE-INSERT-NONFULL(r , k)

Gilberto Gutiérrez (UBB) June 1, 2017 14 / 26


Insertando una clave en un B−tree

1: B-TREE-INSERT-NONFULL(x,k)
2: i ← n[x]
3: if leaf [x]
4: then while i ≥ 1 and k < keyi [x]
5: do keyi +1 [x] ← keyi [x]
6: i ←i −1
7: keyi +1 ← k
8: n[x] ← n[x] + 1
9: DISK-WRITE(x)
10: else while i ≥ 1 and k < keyi [x]
11: do i ← i − 1
12: i ←i +1
13: DISK-READ(ci [x])
14: if n[ci [x]] = 2t − 1
15: then B-TREESPLIT-CHILD(x, i, ci [x])
16: if k > keyi [x]
17: then i ← i + 1
18: B-TREE-INSERT-NONFULL(ci [x], k)

Gilberto Gutiérrez (UBB) June 1, 2017 15 / 26


Insertando una clave en un B−tree

t=3
(a) Arbol Inicial
GMPX

ACDE JK NO RSTUV YZ
(b) Se Inserta B

GMPX

ABCDE JK NO RSTUV YZ

Gilberto Gutiérrez (UBB) June 1, 2017 16 / 26


Insertando una clave en un B−tree

GMPX

ABCDE JK NO RSTUV YZ
(c) Se Inserta Q

GMPTX

ABCDE JK NO QRS UV YZ

Gilberto Gutiérrez (UBB) June 1, 2017 17 / 26


GMPTX

ABCDE JK NO QRS UV YZ
(d) Se Inserta L

P
GM TX

ABCDE JKL NO QRS UV YZ

Gilberto Gutiérrez (UBB) June 1, 2017 18 / 26


P
GM TX

ABCDE JKL NO QRS UV YZ

(e) Se Inserta F

P
CGM TX

AB DEF JKL NO QRS UV YZ

Gilberto Gutiérrez (UBB) June 1, 2017 19 / 26


Eliminación de una clave en un B−tree

Análoga a la inserción, pero un poco más complicado:


Una clave puede ser eliminada desde cualquier nodo
La eliminación de una clave desde un nodo interno puede requerir
reordenar los nodos internos
Al igual que la inserción, se debe garantizar que no se violen las
restricciones del B−tree.
La cantidad de claves en un nodo no debe ser menor que t − 1.
El procedimiento B-TREE-DELETE se llama para eliminar la clave k
del subárbol cuya raı́z es x. El procedimiento garantiza que si se
llama de manera recursiva sobre un nodo x, el número de claves en x
es al menos t.
La restricción del procedimiento B-TREE-DELETE permite eliminar
una clave en una sola pasada (desde la raı́z hacia las hojas).

Gilberto Gutiérrez (UBB) June 1, 2017 20 / 26


Eliminación de una clave en un B−tree

t=3
(a) Arbol Inicial P
CGM TX

AB DEF JKL NO QRS UV YZ

(b) Se elimina F : Caso 1

P
CGM TX

AB DE JKL NO QRS UV YZ

(c) Se elimina M : Caso 2a

P
CGL TX

AB DE JK NO QRS UV YZ

Gilberto Gutiérrez (UBB) June 1, 2017 21 / 26


Eliminación de una clave en un B−tree

P
CGL TX

AB DE JK NO QRS UV YZ
(d) Se elimina G : Caso 2c

P
CL TX

AB DEJK NO QRS UV YZ

(e) Se elimina D : Caso 3b

CLPTX

AB EJK NO QRS UV YZ

(f) Se elimina B : Caso 3a

ELPTX

AC JK NO QRS UV YZ

Gilberto Gutiérrez (UBB) June 1, 2017 22 / 26


Eliminación de una clave en un B−tree

1 Si la clave k está en el nodo x y x es una hoja, entonces eliminar la


clave k de x
2 Si la clave k está en el nodo x y x es un nodo interno, hacer lo
siguiente:
(a) Si el hijo y que precede a k en el nodo x tiene al menos t claves,
entonces encontrar el predecesor k ′ de k en el subárbol con raı́z y .
Recursivamente eliminar k ′ y reemplazar k por k ′ en x
(b) Simétricamente, si el hijo z que sigue a k en el nodo x tiene al menos t
claves, entonces encontrar el sucesor k ′ de k en el subárbol con raı́z z.
Recursivamente eliminar k ′ y reemplazar k por k ′ en x
(c) En otro caso, si tanto y como z tienen sólo t − 1 claves, mezclar k y
todas las de z en y , asi que x pierde tanto la clave k como el puntero a
z, e y contiene ahora 2t − 1 claves. Luego z debe liberarse y
recursivamente se elimina k desde y .

Gilberto Gutiérrez (UBB) June 1, 2017 23 / 26


Eliminación de una clave en un B−tree (Cont.)

3 Si la clave k no se encuentra en el nodo interno x, determinar la raı́z


ci [x] del subárbol apropiado que debe contener a k, si ella se encuentra
en el árbol. Si ci [x] tiene sólo t − 1 claves ejecutar los pasos 3a o 3b
según sea necesario con tal de garantizar que se logra descender a un
nodo que contiene al menos t claves. Luego, completar de manera
recursiva sobre el hijo apropiado de x.
(a) Si ci [x] tiene solamente t − 1 claves pero tiene un hermano con al menos t
claves, dar a ci [x] una clave extra moviendo una clave desde x hacia ci [x],
moviendo una clave desde el hermano izquierdo o derecho inmediato de
ci [x] hacia x y moviendo el puntero al hijo apropiado desde el hermnano
hacia ci [x].
(b) Si ci [x] y sus hermanos inmediato tienen t − 1 claves, mezclar ci [x] con
uno de los hermanos, y mover una clave desde x hacia el nuevo nodo
mezclado transformándose en la mediana del nodo.

Gilberto Gutiérrez (UBB) June 1, 2017 24 / 26


Arbol B+ /B+−tree

Definición
Similar a un B−tree salvo:
1 Existen dos tipos de nodos: Internos y Hojas
2 Nodos Internos: No hay punteros a los datos, sólo a nodos del árbol.
3 Nodos Hojas: Están al mismo nivel. Forman una lista encadenada
ordenada por la clave. Punteros a los datos.
4 Todas las claves se encuentran en las hojas
5 Pueden haber claves repetidas en los nodos internos.

Gilberto Gutiérrez (UBB) June 1, 2017 25 / 26


Ejemplo de un B + −tree

Ejemploa
a
tomado de Wikipedia, https://en.wikipedia.org/wiki/B%2B tree

Gilberto Gutiérrez (UBB) June 1, 2017 26 / 26

Вам также может понравиться