En informática , un árbol de búsqueda binaria óptimo (BST óptimo) , a veces llamado árbol binario ponderado , [ 1 ] es un árbol de búsqueda binaria que proporciona el menor tiempo de búsqueda posible (o tiempo de búsqueda esperado ) para una secuencia dada de accesos (o probabilidades de acceso). Los BST óptimos se dividen generalmente en dos tipos: estáticos y dinámicos.
En el problema de optimalidad estática , el árbol no puede modificarse una vez construido. En este caso, existe una disposición particular de los nodos del árbol que proporciona el menor tiempo de búsqueda esperado para las probabilidades de acceso dadas. Existen diversos algoritmos para construir o aproximar el árbol estáticamente óptimo a partir de la información sobre las probabilidades de acceso de los elementos.
En el problema de optimalidad dinámica , el árbol puede modificarse en cualquier momento, generalmente mediante rotaciones . Se considera que el árbol tiene un cursor que parte de la raíz y que puede moverse o utilizar para realizar modificaciones. En este caso, existe una secuencia de operaciones de coste mínimo que hace que el cursor visite cada nodo de la secuencia de acceso objetivo en orden. Se conjetura que el árbol splay tiene una razón de competitividad constante en comparación con el árbol dinámicamente óptimo en todos los casos, aunque esto aún no se ha demostrado.
Optimalidad estática
Definición
En el problema de optimalidad estática definido por Knuth , [ 2 ] se nos da un conjunto de n elementos ordenados y un conjunto deprobabilidades. Denotaremos los elementosa través dey las probabilidadesa través deya través de.es la probabilidad de que se realice una búsqueda del elemento(o búsqueda exitosa ). [ 3 ] Para,es la probabilidad de que se realice una búsqueda de un elemento entrey(o búsqueda infructuosa ), [ 3 ]es la probabilidad de que se realice una búsqueda de un elemento estrictamente menor que, y¿La probabilidad de que se realice una búsqueda de un elemento es estrictamente mayor que...?. EstosLas probabilidades abarcan todas las búsquedas posibles y, por lo tanto, suman uno.
El problema de optimalidad estática es el problema de optimización de encontrar el árbol de búsqueda binaria que minimiza el tiempo de búsqueda esperado, dado elprobabilidades. Como el número de árboles posibles en un conjunto de n elementos es, [ 2 ] que es exponencial en n , la búsqueda por fuerza bruta no suele ser una solución factible.
Algoritmo de programación dinámica de Knuth
En 1971, Knuth publicó un algoritmo de programación dinámica relativamente sencillo capaz de construir el árbol estáticamente óptimo en solo O ( n² ) tiempo. [ 2 ] En este trabajo, Knuth extendió y mejoró el algoritmo de programación dinámica de Edgar Gilbert y Edward F. Moore introducido en 1958. [ 4 ] El algoritmo de Gilbert y Moore requeríatiempo yespacio y fue diseñado para un caso particular de construcción de árboles de búsqueda binaria óptimos (conocido como problema del árbol alfabético óptimo [ 5 ] ) que considera solo la probabilidad de búsquedas no exitosas, es decir,El trabajo de Knuth se basó en la siguiente idea: el problema de optimalidad estática presenta una subestructura óptima ; es decir, si un árbol determinado es estáticamente óptimo para una distribución de probabilidad dada, entonces sus subárboles izquierdo y derecho también deben ser estáticamente óptimos para sus subconjuntos apropiados de la distribución (lo que se conoce como propiedad de monotonicidad de las raíces).
Para ver esto, consideremos lo que Knuth llama la "longitud de camino ponderada" de un árbol. La longitud de camino ponderada de un árbol de n elementos es la suma de las longitudes de todos los caminos.Posibles rutas de búsqueda, ponderadas según sus respectivas probabilidades. El árbol con la longitud de ruta ponderada mínima es, por definición, estáticamente óptimo.
Pero las longitudes de camino ponderadas tienen una propiedad interesante. Sea E la longitud de camino ponderada de un árbol binario, E L la longitud de camino ponderada de su subárbol izquierdo y E R la longitud de camino ponderada de su subárbol derecho. Sea también W la suma de todas las probabilidades en el árbol. Observe que cuando cualquiera de los subárboles se adjunta a la raíz, la profundidad de cada uno de sus elementos (y, por lo tanto, de cada uno de sus caminos de búsqueda) aumenta en uno. Observe también que la raíz misma tiene una profundidad de uno. Esto significa que la diferencia en la longitud de camino ponderada entre un árbol y sus dos subárboles es exactamente la suma de cada probabilidad individual en el árbol, lo que lleva a la siguiente recurrencia:
Esta recurrencia conduce a una solución de programación dinámica natural.Sea la longitud de ruta ponderada del árbol de búsqueda estáticamente óptimo para todos los valores entre a i y a j , seasea el peso total de ese árbol, y seaSea el índice de su raíz. El algoritmo se puede construir utilizando las siguientes fórmulas:
La implementación ingenua de este algoritmo en realidad toma un tiempo de O ( n 3 ), pero el artículo de Knuth incluye algunas observaciones adicionales que se pueden utilizar para producir un algoritmo modificado que toma solo un tiempo de O ( n 2 ).
Además de su algoritmo de programación dinámica, Knuth propuso dos heurísticas (o reglas) para producir árboles de búsqueda binaria casi óptimos (aproximados a ellos) . Estudiar árboles de búsqueda binaria casi óptimos era necesario ya que la complejidad temporal y espacial del algoritmo de Knuth puede ser prohibitiva cuandoes sustancialmente grande. [ 6 ]
Las reglas de Knuth pueden verse de la siguiente manera:
- Regla I (Raíz máxima): Coloca el nombre que aparece con mayor frecuencia en la raíz del árbol y luego procede de manera similar en los subárboles.
- Regla II (Bisección): Elija la raíz de manera que se iguale el peso total de los subárboles izquierdo y derecho tanto como sea posible, y luego proceda de manera similar con los subárboles.
La heurística de Knuth implementa árboles de búsqueda binaria casi óptimos entiempo yespacio. Kurt Mehlhorn propuso además un análisis sobre cuán lejos del óptimo pueden estar las heurísticas de Knuth . [ 6 ]
Algoritmo de aproximación de Mehlhorn
Aunque el tiempo O ( n2 ) que tarda el algoritmo de Knuth es sustancialmente mejor que el tiempo exponencial requerido para una búsqueda por fuerza bruta, sigue siendo demasiado lento para ser práctico cuando el número de elementos en el árbol es muy grande.
En 1975, Kurt Mehlhorn publicó un artículo que demostraba propiedades importantes de las reglas de Knuth. Los principales resultados de Mehlhorn indican que solo una de las heurísticas de Knuth (Regla II) siempre produce árboles de búsqueda binaria casi óptimos. Por otro lado, la regla root-max a menudo puede generar árboles de búsqueda muy deficientes, según el siguiente argumento simple. [ 6 ]
Dejar
y
Considerando la longitud de la ruta ponderadaDel árbol construido a partir de la definición anterior, tenemos lo siguiente:
Por lo tanto, el árbol resultante según la regla root-max será un árbol que crece solo en el lado derecho (excepto en el nivel más profundo del árbol), y el lado izquierdo siempre tendrá nodos terminales. Este árbol tiene una longitud de camino limitada pory, en comparación con un árbol de búsqueda equilibrado (con ruta delimitada por), tendrá un rendimiento sustancialmente peor para la misma distribución de frecuencia. [ 6 ]
Además, Mehlhorn mejoró el trabajo de Knuth e introdujo un algoritmo mucho más simple que utiliza la Regla II y se aproxima mucho al rendimiento del árbol estáticamente óptimo en solo tiempo. [ 6 ] El algoritmo sigue la misma idea de la regla de bisección al elegir la raíz del árbol para equilibrar el peso total (por probabilidad) de los subárboles izquierdo y derecho de la manera más precisa. Y la estrategia se aplica luego recursivamente en cada subárbol.
Que esta estrategia produce una buena aproximación se puede ver intuitivamente al observar que los pesos de los subárboles a lo largo de cualquier camino forman algo muy cercano a una secuencia geométricamente decreciente. De hecho, esta estrategia genera un árbol cuya longitud de camino ponderado es como máximo
donde H es la entropía de la distribución de probabilidad. Dado que ningún árbol de búsqueda binaria óptimo puede hacerlo mejor que una longitud de ruta ponderada de
Esta aproximación es muy cercana. [ 6 ]
Algoritmos de Hu-Tucker y Garsia-Wachs
En el caso especial de que todos losLos valores son cero, el árbol óptimo se puede encontrar en tiempoEsto fue demostrado por primera vez por TC Hu y Alan Tucker en un artículo que publicaron en 1971. Una simplificación posterior de Garsia y Wachs, el algoritmo de Garsia-Wachs , realiza las mismas comparaciones en el mismo orden. El algoritmo funciona utilizando un algoritmo voraz para construir un árbol que tiene la altura óptima para cada hoja, pero está fuera de orden, y luego construye otro árbol de búsqueda binaria con las mismas alturas. [ 7 ]
Fragmento de código de ejemplo
El siguiente fragmento de código determina un árbol de búsqueda binaria óptimo cuando se le proporciona un conjunto de claves y valores de probabilidad de que la clave sea la clave de búsqueda:
public static float calculateOptimalSearchTree(int numNodes, float[] probabilities, int[][] roots) { float[][] costMatrix = new float[numNodes + 2][numNodes + 1]; para (int i = 1; i <= numNodes; i++) { costMatrix[i][i - 1] = 0; costMatrix[i][i] = probabilidades[i]; raíces[i][i] = i; raíces[i][i - 1] = 0; } para (int diagonal = 1; diagonal <= numNodes; diagonal++) { para (int i = 1; i <= numNodes - diagonal; i++) { entero j = i + diagonal; costMatrix[i][j] = findMinCost(costMatrix, i, j) + sumProbabilities(probabilities, i, j); // Nota: falta la asignación de roots[i][j], esto debe corregirse si lo desea. // para reconstruir el árbol. } } devolver matriz de costos[1][numNodos]; }Optimalidad dinámica
Definición
Existen varias definiciones diferentes de optimalidad dinámica, todas las cuales son efectivamente equivalentes con un factor constante en términos de tiempo de ejecución. [ 8 ] El problema fue introducido implícitamente por primera vez por Sleator y Tarjan en su artículo sobre árboles splay , [ 9 ] pero Demaine et al. ofrecen una formulación formal muy buena del mismo. [ 8 ]
En el problema de optimalidad dinámica, se nos da una secuencia de accesos x 1 , ..., x m sobre las claves 1, ..., n. Para cada acceso, se nos da un puntero a la raíz de nuestro BST y podemos usar el puntero para realizar cualquiera de las siguientes operaciones:
- Mueva el puntero al hijo izquierdo del nodo actual.
- Mueva el puntero al hijo derecho del nodo actual.
- Mueva el puntero al nodo padre del nodo actual.
- Realiza una única rotación sobre el nodo actual y su nodo padre.
(Es la presencia de la cuarta operación, que reorganiza el árbol durante los accesos, lo que convierte esto en un problema de optimalidad dinámica ).
Para cada acceso, nuestro algoritmo BST puede realizar cualquier secuencia de las operaciones anteriores, siempre que el puntero termine en el nodo que contiene el valor objetivo x i . El tiempo que tarda un algoritmo BST dinámico en realizar una secuencia de accesos es equivalente al número total de operaciones realizadas durante dicha secuencia. Dada cualquier secuencia de accesos a cualquier conjunto de elementos, existe un número mínimo total de operaciones necesarias para realizar esos accesos. Nos gustaría aproximarnos a este mínimo.
Si bien es imposible implementar este " algoritmo de Dios " sin conocer de antemano la secuencia de acceso exacta, podemos definir OPT(X) como el número de operaciones que realizaría para una secuencia de acceso X, y podemos decir que un algoritmo es dinámicamente óptimo si, para cualquier X, realiza X en tiempo O (OPT(X)) (es decir, tiene una razón de competitividad constante ). [ 8 ]
Se han conjeturado varias estructuras de datos que poseen esta propiedad, pero ninguna ha sido probada. Sigue siendo un problema abierto determinar si existe una estructura de datos dinámicamente óptima en este modelo.
Árboles de ramas extendidas
El árbol splay es una forma de árbol de búsqueda binaria inventada en 1985 por Daniel Sleator y Robert Tarjan sobre la cual se ejecutan las operaciones estándar del árbol de búsqueda.tiempo amortizado. [ 10 ] Se conjetura que es dinámicamente óptimo en el sentido requerido. Es decir, se cree que un árbol splay realiza cualquier secuencia de acceso suficientemente larga X en tiempo O(OPT(X)). [ 9 ]
Árboles de tango
El árbol tango es una estructura de datos propuesta en 2004 por Erik D. Demaine , Dion Harmon, John Iacono y Mihai Pătrașcu que ha demostrado realizar cualquier secuencia de acceso suficientemente larga X en tiempo. Si bien esto no es dinámicamente óptimo, la relación competitiva desigue siendo muy pequeño para valores razonables de n. [ 8 ]
Otros resultados
En 2013, John Iacono publicó un artículo que utiliza la geometría de los árboles de búsqueda binaria para proporcionar un algoritmo que es dinámicamente óptimo si algún algoritmo de árbol de búsqueda binaria es dinámicamente óptimo. [ 11 ] Los nodos se interpretan como puntos en dos dimensiones, y la secuencia de acceso óptima es el superconjunto más pequeño de esos puntos que satisface arborísticamente . A diferencia de los árboles splay y los árboles tango, no se sabe si la estructura de datos de Iacono se puede implementar en tiempo constante por paso de secuencia de acceso, por lo que incluso si es dinámicamente óptima, aún podría ser más lenta que otras estructuras de datos de árboles de búsqueda por un factor no constante.
El límite inferior de entrelazado es un límite inferior asintótico para la optimalidad dinámica.
Véase también
Notas
- ↑ Tremblay, Jean-Paul; Cheston, Grant A. (2001). Estructuras de datos y desarrollo de software en un dominio orientado a objetos . Eiffel Edition/Prentice Hall. ISBN 978-0-13-787946-5.
- 1 2 3 Knuth, Donald E. (1971), "Árboles de búsqueda binaria óptimos", Acta Informatica , 1 (1): 14– 25, doi : 10.1007/BF00264289 , S2CID 62777263
- 1 2 Nagaraj, SV (1997-11-30). "Árboles de búsqueda binaria óptimos" . Theoretical Computer Science . 188 (1): 1– 44. doi : 10.1016/S0304-3975(96)00320-9 . ISSN 0304-3975 . S2CID 33484183 .
- ↑ Gilbert, EN; Moore, EF (julio de 1959). "Codificaciones binarias de longitud variable" . Bell System Technical Journal . 38 (4): 933– 967. doi : 10.1002/j.1538-7305.1959.tb01583.x .
- ↑ Hu, TC ; Tucker, AC (diciembre de 1971). "Árboles de búsqueda computacional óptimos y códigos alfabéticos de longitud variable" . SIAM Journal on Applied Mathematics . 21 (4): 514– 532. doi : 10.1137/0121057 . ISSN 0036-1399 .
- 1 2 3 4 5 6 Mehlhorn, Kurt (1975), "Árboles de búsqueda binaria casi óptimos" , Acta Informatica , 5 (4): 287–295 , doi : 10.1007/BF00264563 , S2CID 17188103
- ↑ Knuth, Donald E. (1998), "Algoritmo G (algoritmo de Garsia-Wachs para árboles binarios óptimos)", El arte de la programación informática, vol. 3: Ordenación y búsqueda ( 2.ª ed.), Addison-Wesley, págs. 451-453 Véase también Historia y bibliografía, págs. 453-454.
- 1 2 3 4 Demaine, Erik D.; Harmon, Dion; Iacono, John; Patrascu, Mihai (2004), "Optimalidad dinámica: casi" (PDF) , Actas del 45.º Simposio Anual IEEE sobre Fundamentos de la Informática , págs. 484–490 , CiteSeerX 10.1.1.99.4964 , doi : 10.1109/FOCS.2004.23 , ISBN 978-0-7695-2228-9
- 1 2 Sleator, Daniel; Tarjan, Robert (1985), "Árboles de búsqueda binaria autoajustables", Journal of the ACM , 32 (3): 652– 686, doi : 10.1145/3828.3835 , S2CID 1165848
- ^ Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald; Stein, Clifford (2009). Introducción a los algoritmos (PDF) (Tercera ed.). La prensa del MIT. pag. 503.ISBN 978-0-262-03384-8Consultado el 31 de octubre de 2017 .
- ↑ Iacono, John (2013), "En busca de la conjetura de optimalidad dinámica", arXiv : 1306.0207 [ cs.DS ]
- Árboles binarios
- Buscar árboles