¿Cómo ingresar registros con claves para un árbol B + inicialmente vacío?

11

Muestre el resultado de ingresar los registros con claves en el orden (1, 2, 3, 4, 5) en un árbol B + –inicialmente vacío de orden m = 3. En caso de desbordamiento, divida el nodo y no vuelva a distribuirlo Llaves para vecinos. ¿Es posible ingresar los registros con claves en un orden diferente para tener un árbol de menor altura?

De lo interno de DBMS relacional, capítulo 5: Organizaciones dinámicas de estructura de árbol, p.50

No soy bueno en esto, pero intenté hacer ≤ a la izquierda y> a la derecha:

Hasta la inserción de 1,2:

ingrese la descripción de la imagen aquí

Luego, en la medida en que tenemos que dividir el nodo y no redistribuir las claves a los vecinos (lo entiendo como nodos hijo), inserté solo a la derecha de la celda con 2:

ingrese la descripción de la imagen aquí

Y seguí haciendo lo mismo al insertar 5:

ingrese la descripción de la imagen aquí

Pero esto es bastante extraño, nunca vi nodos vacíos como estos ... Y no sé si respeta algunas propiedades básicas de los árboles B:

  • cada nodo tiene como máximo claves (m-1) y al menos claves (⌈ (m / 2) ⌉-1) a menos que una clave pueda estar vacía y yo entendería la clave como un "puntero".

Primer intento: el error en el pedido reveló un árbol ambiguo

Al principio no entendí qué era un "orden" (el número máximo de hijos por nodo). Entonces pensé que un nodo podría tener tres espacios (y por lo tanto 4 hijos. Estaba creando un árbol de orden 4, creo:

Hasta la inserción de 1,2,3:

ingrese la descripción de la imagen aquí

Inserción de 4, en la medida en que tengamos que dividir el nodo y no redistribuir las claves a los vecinos (lo que parece contradictorio), dejaría 1,2,3 y 4,5 en la hoja derecha después de 3:

B árbol de orden 3 después de insertar 4 y 5

Revolución para Monica
fuente

Respuestas:

6

Creo que tienes la creación de tu página al revés. Cuando un nodo se divide, no crea más nodos en la jerarquía (nodos hijos en su nomenclatura). En cambio, crea más hacia arriba , hacia la raíz. Como dice el libro

Tenga en cuenta que el crecimiento está en la parte superior del árbol, y esta es una característica intrínseca de un árbol B para garantizar las propiedades importantes de que siempre tiene todas las hojas al mismo nivel, y que cada nodo diferente de la raíz es al menos 50% lleno.

(Mi énfasis)

Del libro electrónico vinculado:

Definición 5.1 AB – árbol de orden m (m ≥ 3) ... cada nodo contiene como máximo m - 1 claves

El ejercicio es para m = 3, por lo tanto, como máximo 2 teclas por nodo.

Las dos primeras teclas son fáciles: van a la primera página:

A:[1,2]

Voy a usar el arte ASCII. Etiquetaré cada página en la secuencia en que fueron creadas y mostraré las teclas / punteros dentro de la página. Entonces la página P que contiene los valores clave k1 y k2 será P:[k1,k2].

Ahora aparece la clave 3. De acuerdo con la Sección 5.2.1 ... Inserción, la primera tarea es buscar. Esto determina que la clave 3 debe estar en la página A, la única página que tenemos. Además "si [ese nodo] está lleno, se dividirá en dos nodos". La página está llena, por lo que debe dividirse. Ahora tenemos

A:[1,2]    B:[3, ]

¡Pero esto no es un árbol! Como dice el libro:

el puntero a [el nuevo nodo], .. se inserta en el nodo padre .. de [el nodo actual], repitiendo la operación de inserción en este nodo [es decir, el nodo padre]. Este proceso de división y avance puede continuar si es necesario hasta la raíz, y si se debe dividir, se creará un nuevo nodo raíz.

(Mi énfasis en mostrar el procesamiento continúa hacia arriba del árbol hacia la raíz, no hacia las hojas).

Por lo tanto, debemos poner un puntero a la nueva página (B) en el padre de la página actual (A). Debe haber un nuevo nodo raíz:

      C:[2,3]
      /     \
A:[1,2]    B:[3, ]

Tengo los punteros en páginas que no son hojas que apuntan al valor más alto en un nodo hijo (hijo). Su texto vinculado puede hacer esto de manera diferente, pero el resultado será equivalente.

Llega el valor clave 4; siguiendo el algoritmo buscamos para encontrar en qué página debería estar. Debería ser la página B. Hay espacio para ella, así que actualizamos esa página y el puntero en la página C:

      C:[2,4]
      /     \
A:[1,2]    B:[3,4]

Luego insertamos la clave 5. Debería ir en la página B pero está llena. Por lo tanto, se divide

      C:[2,4]
      /     \
A:[1,2]    B:[3,4]   D:[5, ]

Debemos actualizar el nodo padre. También está lleno, por lo que se divide:

      C:[2,4]    E:[5, ]
      /     \         \
A:[1,2]    B:[3,4]   D:[5, ]

La división se propaga y se forma un nuevo nodo raíz:

            F:[4,5]
            /     \
      C:[2,4]    E:[5, ]
      /     \         \
A:[1,2]    B:[3,4]   D:[5, ]

Al crecer hacia arriba, el árbol mantiene una profundidad idéntica en cada rama. Esto es importante para un rendimiento predecible. (Algunos dicen que B en B-Tree significa "equilibrado" por esta misma razón).


En cuanto a la segunda parte: "¿Es posible ingresar los registros con claves en un orden diferente para tener un árbol de menor altura?" Con 5 claves y dos claves por nodo, necesitamos al menos 3 nodos de hoja para contener todos los valores y una altura de 3 para formar el árbol. Entonces, mi disposición es óptima para los datos, la secuencia y el algoritmo dados.

El libro usa una disposición de puntero muy diferente a la que yo uso, y una disposición de división de página diferente. Esto será significativo y llevará a páginas parcialmente completas. Que hay una sección en la página 42 llamada "Carga de datos" que muestra cómo se pueden lograr páginas más completas al cargar la secuencia de teclas. Sin embargo, espero haberte dado suficientes punteros y podrás usar la estructura de punteros del libro para resolverlo por ti mismo.


Me he encontrado con esta simulación interactiva de cómo crece un B-Tree.

Michael Green
fuente