Un árbol BK es un árbol métrico sugerido por Walter Austin Burkhard y Robert M. Keller [1] adaptado específicamente a espacios métricos discretos . Para simplificar, considere la métrica discreta entera . Entonces, el árbol BK se define de la siguiente manera. Se selecciona un elemento arbitrario a como nodo raíz. El nodo raíz puede tener cero o más subárboles. El k-ésimo subárbol se construye recursivamente de todos los elementos b tales que . Los árboles BK se pueden usar para la coincidencia aproximada de cadenas en un diccionario. [2] [ ejemplo necesario ]
Ejemplo

Esta imagen muestra el árbol BK para el conjunto de palabras {"book", "books", "cake", "boo", "boon", "cook", "cake", "cape", "cart"} obtenido mediante el uso de la distancia de Levenshtein.
- Cada nodo está etiquetado por una cadena de ;
- Cada arco está etiquetado por donde denota la palabra asignada a .
El árbol BK está construido de manera que:
- Para cada nodo del árbol BK, el peso asignado a sus arcos de salida es distinto;
- Para todo arco etiquetado por , cada descendiente de satisface la siguiente ecuación: :
- Ejemplo 1: Considere el arco que va desde "book" hasta "books". La distancia entre "book" y cualquier palabra en {"books", "boo", "boon", "cook"} es igual a 1;
- Ejemplo 2: Considere el arco que va desde "books" hasta "boo". La distancia entre "books" y cualquier palabra en {"boo", "boon", "cook"} es igual a 2.
Inserción
La primitiva de inserción se utiliza para rellenar un árbol BK de acuerdo con una métrica discreta .
Aporte:
- :el árbol BK;
- denota el peso asignado a un arco ;
- denota palabra asignada a un nodo ;
- :la métrica discreta utilizada por (por ejemplo, la distancia de Levenshtein );
- :el elemento que se insertará en ;
Producción:
- El nodo correspondiente a
Algoritmo:
- Si está vacío:
- Crear un nodo raíz en
- Devolver
- Establecer en la raíz de
- Mientras exista:
- Si :
- Devolver
- Encuentra el hijo de tal que
- Si no se encuentra:
- Crear el nodo
- Crea el arco
- Devolver
Buscar
Dado un elemento buscado , la primitiva de búsqueda recorre el árbol BK para encontrar el elemento más cercano de . La idea clave es restringir la exploración de a los nodos que solo pueden mejorar el mejor candidato encontrado hasta el momento aprovechando la organización del árbol BK y la desigualdad triangular (criterio de corte).
Aporte:
- :el árbol BK;
- :la métrica discreta correspondiente (por ejemplo, la distancia de Levenshtein );
- :el elemento buscado;
- :la distancia máxima permitida entre la mejor coincidencia y , el valor predeterminado es ;
Producción:
- :el elemento más cercano a almacenado en y según o si no se encuentra;
Algoritmo:
- Si está vacío:
- Devolver
- Cree un conjunto de nodos para procesar e inserte la raíz de en .
- Mientras :
- Extraer un nodo arbitrario de
- Si :
- Para cada arco de salida :
- Si : (criterio de corte)
- Insertar en .
- Si : (criterio de corte)
- Devolver
Ejemplo del algoritmo de búsqueda
Considere el ejemplo de árbol BK de 8 nodos que se muestra arriba y configure "cool". se inicializa para que contenga la raíz del árbol, que posteriormente se extrae como el primer valor de con ="book". Además, dado que la distancia de "book" a "cool" es 2, y como esta es la mejor (es decir, la más pequeña) distancia encontrada hasta ahora. A continuación, se considera cada arco saliente desde la raíz por turno: el arco de "book" a "books" tiene peso 1, y como es menor que , el nodo que contiene "books" se inserta en para su posterior procesamiento. El siguiente arco, de "book" a "cake", tiene peso 4, y como no es menor que , el nodo que contiene "cake" no se inserta en . Por lo tanto, el subárbol enraizado en "cake" se podará de la búsqueda, ya que la palabra más cercana a "cool" no puede aparecer en ese subárbol. Para ver por qué esta poda es correcta, observe que una palabra candidata que aparece en el subárbol "cake" y que tiene una distancia menor que 2 a "cool" violaría la desigualdad triangular: la desigualdad triangular requiere que para este conjunto de tres números (como lados de un triángulo), ningún par puede sumar menos que el tercero, pero aquí la distancia de "cool" a "book" (que es 2) más la distancia de "cool" a (que es menor que 2) no puede alcanzar o superar la distancia de "book" a "cake" (que es 4). Por lo tanto, es seguro ignorar todo el subárbol enraizado en "cake".
A continuación, se extrae el nodo que contiene "libros" de y ahora , la distancia de "genial" a "libros". Como , permanece establecido en 2 y se considera el único arco saliente del nodo que contiene "libros". A continuación, se extrae el nodo que contiene "buuu" de y , la distancia de "genial" a "buuu". Esto tampoco mejora . Ahora se considera cada arco saliente de "buuu"; el arco de "buuu" a "bendición" tiene peso 1, y como , "bendición" se suma a . De manera similar, como , "cocinar" también se suma a .
Finalmente, cada uno de los dos últimos elementos en se considera en orden arbitrario: supongamos que el nodo que contiene "cook" se elimina primero, mejorando a la distancia 1, luego el nodo que contiene "boon" se elimina por último, que tiene una distancia de 2 de "cool" y, por lo tanto, no mejora el mejor resultado. Finalmente, "cook" se devuelve como la respuesta con .
Véase también
- Distancia de Levenshtein : la métrica de distancia que se usa comúnmente al construir un árbol BK
- Distancia Damerau-Levenshtein : una forma modificada de la distancia de Levenshtein que permite transposiciones
Referencias
- ^ W. Burkhard y R. Keller. Algunos enfoques para la búsqueda de archivos con la mejor coincidencia, CACM, 1973
- ^ R. Baeza-Yates, W. Cunto, U. Manber y S. Wu. Coincidencia de proximidad mediante árboles de consultas fijas. En M. Crochemore y D. Gusfield, editores, 5th Combinatorial Pattern Matching, LNCS 807, páginas 198–212, Asilomar, CA, junio de 1994.
- ^ Ricardo Baeza-Yates y Gonzalo Navarro. Correspondencia rápida aproximada de cadenas en un diccionario. Proc. SPIRE'98
Enlaces externos
- Una implementación de árbol BK en Common Lisp con resultados de pruebas y gráficos de rendimiento.
- Una explicación de los árboles BK y su relación con los espacios métricos [3]
- Una explicación de los árboles BK con una implementación en C# [4]
- Una implementación de árbol BK en Lua [5]
- Una implementación de árbol BK en Python [6]