Articulo de referencia

árbol BK

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 l...

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 ] d ( x , y ) {\displaystyle d(x,y)} d ( a , b ) = k {\displaystyle d(a,b)=k}

Ejemplo

Un ejemplo de árbol BK

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. W {\displaystyle W}

  • Cada nodo está etiquetado por una cadena de ; u {\displaystyle u} w u W {\displaystyle w_{u}\in W}
  • Cada arco está etiquetado por donde denota la palabra asignada a . ( u , v ) {\displaystyle (u,v)} d u v = d ( w u , w v ) {\displaystyle d_{uv}=d(w_{u},w_{v})} w u {\displaystyle w_{u}} u {\displaystyle u}

El árbol BK está construido de manera que:

  • Para cada nodo del árbol BK, el peso asignado a sus arcos de salida es distinto; u {\displaystyle u}
  • Para todo arco etiquetado por , cada descendiente de satisface la siguiente ecuación: : e = ( u , v ) {\displaystyle e=(u,v)} k {\displaystyle k} v {\displaystyle v'} v {\displaystyle v} d ( w u , w v ) = k {\displaystyle d(w_{u},w_{v'})=k}
    • 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 . t {\displaystyle t} d {\displaystyle d}

Aporte:

  • t {\displaystyle t} :el árbol BK;
    • d u v {\displaystyle d_{uv}} denota el peso asignado a un arco ; ( u , v ) {\displaystyle (u,v)}
    • w u {\displaystyle w_{u}} denota palabra asignada a un nodo ; u {\displaystyle u}
  • d {\displaystyle d} :la métrica discreta utilizada por (por ejemplo, la distancia de Levenshtein ); t {\displaystyle t}
  • w {\displaystyle w} :el elemento que se insertará en ; t {\displaystyle t}

Producción:

  • El nodo correspondiente a t {\displaystyle t} w {\displaystyle w}

Algoritmo:

  • Si está vacío: t {\displaystyle t}
    • Crear un nodo raíz en r {\displaystyle r} t {\displaystyle t}
    • w r w {\displaystyle w_{r}\leftarrow w}
    • Devolver r {\displaystyle r}
  • Establecer en la raíz de u {\displaystyle u} t {\displaystyle t}
  • Mientras exista: u {\displaystyle u}
    • k d ( w u , w ) {\displaystyle k\leftarrow d(w_{u},w)}
    • Si : k = 0 {\displaystyle k=0}
      • Devolver u {\displaystyle u}
    • Encuentra el hijo de tal que v {\displaystyle v} u {\displaystyle u} d u v = k {\displaystyle d_{uv}=k}
    • Si no se encuentra: v {\displaystyle v}
      • Crear el nodo v {\displaystyle v}
      • w v w {\displaystyle w_{v}\leftarrow w}
      • Crea el arco ( u , v ) {\displaystyle (u,v)}
      • d u v k {\displaystyle d_{uv}\leftarrow k}
      • Devolver v {\displaystyle v}
    • u v {\displaystyle u\leftarrow v}

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). w {\displaystyle w} w {\displaystyle w} t {\displaystyle t}

Aporte:

  • t {\displaystyle t} :el árbol BK;
  • d {\displaystyle d} :la métrica discreta correspondiente (por ejemplo, la distancia de Levenshtein );
  • w {\displaystyle w} :el elemento buscado;
  • d m a x {\displaystyle d_{max}} :la distancia máxima permitida entre la mejor coincidencia y , el valor predeterminado es ; w {\displaystyle w} + {\displaystyle +\infty }

Producción:

  • w b e s t {\displaystyle w_{best}} :el elemento más cercano a almacenado en y según o si no se encuentra; w {\displaystyle w} t {\displaystyle t} d {\displaystyle d} {\displaystyle \perp }

Algoritmo:

  • Si está vacío: t {\displaystyle t}
    • Devolver {\displaystyle \perp }
  • Cree un conjunto de nodos para procesar e inserte la raíz de en . S {\displaystyle S} t {\displaystyle t} S {\displaystyle S}
  • ( w b e s t , d b e s t ) ( , d m a x ) {\displaystyle (w_{best},d_{best})\leftarrow (\perp ,d_{max})}
  • Mientras : S {\displaystyle S\neq \emptyset }
    • Extraer un nodo arbitrario de u {\displaystyle u} S {\displaystyle S}
    • d u d ( w , w u ) {\displaystyle d_{u}\leftarrow d(w,w_{u})}
    • Si : d u < d b e s t {\displaystyle d_{u}<d_{best}}
      • ( w b e s t , d b e s t ) ( w u , d u ) {\displaystyle (w_{best},d_{best})\leftarrow (w_{u},d_{u})}
    • Para cada arco de salida : ( u , v ) {\displaystyle (u,v)}
      • Si : (criterio de corte) | d u v d u | < d b e s t {\displaystyle |d_{uv}-d_{u}|<d_{best}}
        • Insertar en . v {\displaystyle v} S {\displaystyle S}
  • Devolver w b e s t {\displaystyle w_{best}}

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". w = {\displaystyle w=} S {\displaystyle S} u {\displaystyle u} w u {\displaystyle w_{u}} d u = 2 {\displaystyle d_{u}=2} d b e s t = 2 {\displaystyle d_{best}=2} | 1 2 | = 1 {\displaystyle |1-2|=1} d b e s t = 2 {\displaystyle d_{best}=2} S {\displaystyle S} | 4 2 | = 2 {\displaystyle |4-2|=2} d b e s t = 2 {\displaystyle d_{best}=2} S {\displaystyle S} c {\displaystyle c} c {\displaystyle c}

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 . S {\displaystyle S} d u = 3 {\displaystyle d_{u}=3} d u > d b e s t {\displaystyle d_{u}>d_{best}} d b e s t {\displaystyle d_{best}} S {\displaystyle S} d u = 2 {\displaystyle d_{u}=2} d b e s t = 2 {\displaystyle d_{best}=2} | 2 1 | = 1 < d b e s t = 2 {\displaystyle |2-1|=1<d_{best}=2} S {\displaystyle S} | 2 2 | = 0 < d b e s t {\displaystyle |2-2|=0<d_{best}} S {\displaystyle S}

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 . S {\displaystyle S} d b e s t {\displaystyle d_{best}} w b e s t {\displaystyle w_{best}} d b e s t = 1 {\displaystyle d_{best}=1}

Véase también

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
  • 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]
Retrieved from "https://en.wikipedia.org/w/index.php?title=BK-tree&oldid=1245997098"