Árboles B Búsqueda

Árboles B: Búsqueda

Aquí tenemos un árbol B de grado 3, sus nodos puede tener como mucho 3 hijos o dos claves.

image.png

De hecho en este ejemplo tenemos un gran ejemplo de esto en el nodo 65 - 82, que está completo, tiene sus 3 hijos y sus dos claves

image.png

La posible implementación del nodo en un lenguaje sería de la siguiente forma:

Para las diferentes claves usar una colección del lenguaje que sea indexable para acceder cómodamente a sus elementos

Algunos campos como en este ejemplo el grado, puede estar directamente en la clase que represente el árbol como tal.

El número de claves y el número de hijos nos ayuda a mantenernos siempre entre las condiciones vistas anteriormente del número mínimo de hijos o de claves

image.png

Búsqueda en Árboles B

Una búsqueda en un árbol b implica:

  • Buscar entre las claves contenidas en este nodo.
  • Si no lo encontramos, saltar al hijo en el que pueda estar
  • Si el nodo es una hoja, el valor no esta.

Vamos a ver un ejemplo con este nodo de grado 8, que tiene 7 claves y 8 hijos y queremos buscar el valor 82.

Para encontrar el elemento se recorrerán las claves del propio nodo buscando ese valor, el tipo de recorrido en el ejemplo es lineal, pero puede ser binario o cualquiera que sea más óptimo

Una vez encontrado el elemento, podemos devolver el nodo en el que lo hemos encontrado, y en la posición <this, 5>

image.png

Al buscar por ejemplo el 74, al llegar al 82 habría que mirar en los hijos de la clave anterior, dado que el valor podría estar en uno de sus descendientes

image.png

Al buscar un elemento que sea mayor a todas las claves del nodo, lo que hay que hacer es mirar en el hijo derecho de la última clave, si el valor no está ahí, significa que no lo tenemos.

image.png

En el caso en el que el nodo no tenga hijos, al superar las claves con dicho valor, no hace falta seguir buscando dado que el valor no está presente.

En este caso al buscar el 71, cuando pasemos a la clave con valor 82, nos daremos cuenta que el valor no existe.

image.png

Búsqueda y presencia en pseudo-código

Aquí hay un pequeño ejemplo en pseudocódigo de cómo buscar un valor en un nodo dado, y el método exists para devolver un boolean en vez de una tupla(nodo, índice)

image.png

public Pair<Nodo, Integer> busqueda(Nodo nodo, int valor) {
    int i = 0;

    // Recorrer las claves mientras sean menores al valor buscado
    while (i < nodo.getNumeroClaves() && nodo.getClave(i) < valor) {
        i++;
    }

    // Si encontramos el valor en el nodo actual, lo devolvemos
    if (i < nodo.getNumeroClaves() && nodo.getClave(i) == valor) {
        return new Pair<>(nodo, i); // Retornar el nodo y el índice
    }

    // Si el nodo es hoja, el valor no está en el árbol
    if (nodo.esHoja()) {
        return new Pair<>(nodo, null); // Nodo encontrado pero sin índice
    } else {
        // Continuar la búsqueda en el hijo correspondiente
        return busqueda(nodo.getHijo(i), valor);
    }
}

image.png

public boolean presencia(Nodo nodo, int valor) {
    int i = 0;

    // Recorrer las claves mientras sean menores al valor buscado
    while (i < nodo.getNumeroClaves() && nodo.getClave(i) < valor) {
        i++;
    }

    // Si encontramos el valor en el nodo actual, devolver true
    if (i < nodo.getNumeroClaves() && nodo.getClave(i) == valor) {
        return true;
    }

    // Si el nodo es hoja, el valor no está en el árbol
    if (nodo.esHoja()) {
        return false;
    } else {
        // Continuar la búsqueda en el hijo correspondiente
        return presencia(nodo.getHijo(i), valor);
    }
}