Академический Документы
Профессиональный Документы
Культура Документы
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
Ejemplo
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.
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
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).
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)
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.
t=4
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)
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)
t=3
(a) Arbol Inicial
GMPX
ACDE JK NO RSTUV YZ
(b) Se Inserta B
GMPX
ABCDE JK NO RSTUV YZ
GMPX
ABCDE JK NO RSTUV YZ
(c) Se Inserta Q
GMPTX
ABCDE JK NO QRS UV YZ
ABCDE JK NO QRS UV YZ
(d) Se Inserta L
P
GM TX
(e) Se Inserta F
P
CGM TX
t=3
(a) Arbol Inicial P
CGM TX
P
CGM TX
AB DE JKL NO QRS UV YZ
P
CGL TX
AB DE JK NO QRS UV YZ
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
CLPTX
AB EJK NO QRS UV YZ
ELPTX
AC JK NO QRS UV YZ
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.
Ejemploa
a
tomado de Wikipedia, https://en.wikipedia.org/wiki/B%2B tree