Sunteți pe pagina 1din 9

1 Informacin general

En este tema, nos fijamos en varias estructuras de datos para resolver problemas sobre rboles
estticos: dado un rbol esttico, realizamos algn procesamiento previo para construir nuestra
estructura de datos, a continuacin, utilizar la estructura de datos para responder a las consultas
sobre el rbol. Los tres problemas que miramos En este tema son las bsquedas por rangos mnimos
(RMQ), ms ancestros comunes (LCA), y ancestro nivel (LA); vamos a apoyar todas estas consultas
en tiempo constante por operacin, utilizando el espacio lineal.
1.1 Consulta de Rango Mnimo (RMQ)
En el problema de RMQ, se nos da una matriz A de n nmeros (a preprocesar). En una consulta, el
objetivo es encontrar el elemento mnimo en un rango abarcado por A[i] y A[j]:
RMQ(i, j) = (arg)min{A[i], A[i + 1], . . . , [j]}
= k, donde i k j y A[k] se minimiza
Nos preocupamos no slo por el valor del elemento mnimo, sino tambin sobre el ndice k del
elemento mnimo entre A[i] y A[j]; dado el ndice, es fcil buscar el valor real del elemento mnimo,
por lo que es un problema ms general para encontrar el ndice del elemento mnimo entre A[i] y
A[j].
El problema de RMQ no es manifiestamente un problema de rbol, sino que est estrechamente
relacionado con un problema de rbol (el ms bajo ancestro comn).

1.2 Menor Ancestro Comn (LCA)


En el problema de LCA (a veces denominada con menos precisin como ancestro "menos" comn),
queremos preprocesar un rbol arraigado T con n nodos. En una consulta, se nos da dos nodos x e y,
y la meta es encontrar su ancestro comn ms bajo en T:

1.3 Nivel Ancestro (LA)


Por ltimo, tambin vamos a resolver el problema ancestro nivel, en el que estamos de nuevo dieron
un rbol arraigado T. Dado un nodo x y un entero k, la meta de la consulta es encontrar el k th
antepasado del nodo x:
LA(x, k) = parent k (x)
Por supuesto, k no puede ser mayor que la profundidad de x:

Los tres problemas se resolvern en el modelo Word-RAM, aunque el uso de este modelo no es tan
esencial como lo fue en las estructuras de datos enteros que discutimos en temas anteriores. Aunque
LCA y LA parecen problemas similares, tcnicas bastante diferentes son necesarias para resolverlos
(como lo que se sabe). El problema RMQ, sin embargo, es bsicamente idntica a la de encontrar el
ancestro comn ms bajo.

2 Reducciones entre RMQ y LCA


2.1 rboles cartesianos: Reduccin de RMQ a LCA
Un rbol cartesiano es un buen mecanismo de reduccin de una matriz A a un rbol binario T que
ofrece una equivalencia entre RMQ y LCA, y se remonta a una publicacin de 1984 por Gabow,
Bentley, y Tarjan [1].
Para construir un rbol cartesiano, comenzamos con el elemento mnimo de la matriz A, que
llamaremos A[i]. Este elemento se convierte en la raz del rbol cartesiano T. A continuacin, el
subrbol izquierdo de T es un rbol cartesiano en todos los elementos a la izquierda de A[i] (que se
puede escribir como A[<i]), y el subrbol derecho de T es igualmente un rbol cartesiano en los
elementos A[> i].
Un ejemplo se muestra a continuacin para la matriz A = [8, 7, 2, 8, 6, 9, 4, 5]. El mnimo de la
matriz es 2, que es promovido a la raz. Esto descompone el problema en dos mitades, una para el
subarreglo izquierdo [8, 7] y una para el subarreglo derecho [8, 6, 9, 4, 5]. 7 es el elemento mnimo
en el subarreglo de la izquierda y se convierte en el hijo izquierdo de la raz; 4 es el elemento

mnimo del subarreglo derecho y es el hijo derecho de la raz. Este procedimiento contina hasta
que consigamos el rbol binario en el siguiente diagrama.

El rbol resultante T es un min-Heap. Ms interesante, el resultado de un RMQ para un rango


determinado de la matriz A es el LCA de los dos puntos finales en el rbol correspondiente T
cartesiano.
En caso de lazos entre varios elementos mnimos iguales, hay dos opciones:
1. Rompa lazos arbitrariamente, recogiendo uno de los elementos que son iguales como
mnimo.
2. Considere todos los elementos iguales a ser uno "nodo", por lo que un rbol no binario.
Debido a que la segunda opcin es un poco ms sucio, en esta clase vamos a romper los lazos de
manera arbitraria, aunque esta decisin no afectar la respuesta.
2.1.1 Construccin en tiempo lineal
La construccin del rbol cartesiana segn la nave recursive algorithm tendr al menos (n lg n)
tiempo, e incluso puede llevar tiempo cuadrtica. Afortunadamente, los rboles cartesianos se
pueden calcular en tiempo lineal, utilizando un mtodo que es esencialmente el mismo que el
mtodo visto en el ltimo tema para la construccin de un trie comprimido en tiempo lineal.
Caminar a travs del arreglo de izquierda a derecha, insertando cada elemento en el rbol por
caminar hasta la columna derecha del rbol (a partir de la hoja), e insertar el elemento en el lugar
apropiado. Porque estamos construyendo el rbol de izquierda a derecha, cada elemento insertado
ser, por definicin, el elemento ms a la derecha del rbol creado hasta ahora.
Por ejemplo, si tenemos un rbol para que el subarreglo [2, 4, 5] se ha insertado, y el siguiente
elemento es 3, entonces la insercin tiene el siguiente resultado:

Caminamos hasta la columna derecha del inicio del rbol en 5, y continuamos hasta llegar a 2 (la
raz), que es el primer elemento menor que 3. El arco entre 2 y 4 se sustituye por un nuevo arco 2-3,
y el subrbol anterior derecha de 2 se convierte en el subrbol izquierdo de 3.
Cada una de estas inserciones toma tiempo constante amortizado: aunque a veces los caminos
pueden ser largos, cada insercin slo toca nodos a lo largo de la columna vertebral derecha del
rbol, y cualquier nodo a lo largo de la columna vertebral derecha que ha sido tocado termina en el
subrbol izquierdo del nodo insertado. Cualquier nodo a lo largo de la columna derecha se toca
como mximo una vez, y que puede cargar los insertos caros a la disminucin de la longitud de la
columna derecha.
Por lo tanto, la construccin de rboles cartesianos se puede hacer en el tiempo lineal, incluso en el
modelo de comparacin.
2.2 Reduccin de la LCA a RMQ
Tambin podemos reducir en la otra direccin, desde LCA a RMQ, mediante la reconstruccin de
un arreglo A de un rbol binario T. Para ello, realizamos un recorrido en el orden de los nodos en el
rbol. Sin embargo, debemos tener los nmeros a utilizar como los valores del arreglo; con este fin,
etiquetamos cada nodo con su profundidad en el rbol.

Esta secuencia se comporta exactamente como el arreglo original A = [8, 7, 2, 8, 6, 9, 4, 5], de la


que se construy este rbol. El resultado para RMQ (i, j) en el arreglo resultante A es el mismo que
llamar a LCA (i, j) en el rbol de entrada para los nodos correspondientes.

2.3 Reduccin del universo RMQ


Una consecuencia interesante de las reducciones entre RMQ y LCA es que nos permiten hacer
reducciones del universo para problemas RMQ. No hay garantas en los lmites de los nmeros en
el arreglo original dado para consultas mnimas de rango, y en general los elementos pueden estar
en cualquier universo arbitrario ordenado. Por encadenar las dos reducciones ms arriba, en primer
lugar por la construccin de un rbol cartesiano de los elementos y luego mediante la conversin
hacia atrs desde el rbol hasta una gran variedad de profundidades, podemos reducir la distancia al
conjunto de los enteros {0, 1,. . . , n - 1}.
Esta reduccin del universo es muy til; los algoritmos descritos anteriormente suponen un modelo
de comparacin, pero despus de que el par de reducciones que ahora pueden asumir que todas las
entradas son enteros pequeos, lo que nos permite resolver las cosas en la constante de tiempo en el
modelo Word-RAM.

3 Tiempo constante LCA y RMQ


3.1 Resultados
Los problemas de LCA y RMQ pueden ambos ser ptimamente resueltos con tiempo de consulta
constante y espacio de almacenamiento lineal. La primera tcnica conocida est documentado en un
artculo de 1984 por Harel y Tarjan [2]. En el tema, nos fijamos en un algoritmo basado en un
documento de 2004 por Bender y Colton [3].
3.2 Reduccin de LCA a 1 RMQ
El algoritmo de Bender y Colton resuelve un caso especial del problema RMQ llamado 1 RMQ,
en que los valores adyacentes difieren por +1 o -1.
En primer lugar, vamos a echar un vistazo a una reduccin de LCA a 1 RMQ. La reduccin
anterior no funciona como diferencias podran tener valores absolutos mayores que 1. Para nuestro
nuevo enfoque, realizamos un recorrido Euleriano basado en el recorrido en orden y escribir cada
visita en nuestro arreglo LCA. A cada paso del recorrido, ya sea bajar un nivel o subir a uno, por lo
que la diferencia entre dos valores adyacentes en nuestro arreglo es +1 o -1.

Desde que cada arco es visitado dos veces, tenemos ms entradas en el arreglo que en el recorrido
original, en orden, pero aun as slo O(N). Para responder a LCA(x, y), calcular RMQ(en-orden(x),
en-orden(y)), donde en-orden(x) es la aparicin en orden del nodo x en el arreglo. Estos hechos
pueden ser almacenados durante la creacin del arreglo. Observe que este nuevo arreglo tambin se

puede crear mediante el llenado de los vacos en el arreglo del algoritmo original. As, el mnimo
entre dos valores originales no cambia, y este nuevo algoritmo tambin funciona.
3.3 Tiempo constante, espacio n lg n RMQ
Una estructura de datos simple que puede responder a las consultas RMQ en tiempo constante pero
utiliza slo espacio n lg n, puede ser creada por el preclculo de RMQ para todos los intervalos con
longitudes que sean potencias de 2. Hay un total de O(n lg n) los intervalos, ya que hay lg n
intervalos con longitudes que sean potencias de 2 no ms grandes que n, con n posibles ubicaciones
de partida.
Afirmamos que cualquier intervalo consultado es la (no disjuntos) unin de dos potencias de 2
intervalos. Suponer que la consulta tiene longitud k. Entonces la pregunta puede ser cubierta por los
dos intervalos de longitud 2lg k que tocan el principio y el final de la consulta. La consulta se puede
responder mediante la adopcin del mnimo de las dos respuestas precalculadas. Observe que esto
funciona porque podemos tomar el mnimo de un elemento dos veces sin ningn problema.
Adems, esto tambin nos permite almacenar la ubicacin del elemento mnimo.
3.4 Indireccin para eliminar factores de registro
Hemos visto la indireccin utilizada para eliminar los factores de registro de tiempo, pero aqu
vamos a aplicar indireccin para lograr una cota O(n). Divida el arreglo en grupos inferiores de
tamao

lg n (esta constante especfica se utilizar ms adelante). A continuacin, almacenar una

arreglo de tamao 2n/ lg n que almacena el mnimo de cada grupo.


Ahora una consulta se puede responder mediante la bsqueda de la RMQ de una secuencia en el
arreglo de los padres, y en la mayora de dos consultas RMQ en grupos inferiores. Tenga en cuenta
que puede que tengamos que responder a dos consultas de lado en un grupo inferior para
suficientemente pequeas consultas. Para el vector de los padres podemos usar el algoritmo de
espacio n lg n como los logaritmos se cancelan.
3.5 RMQ en muy pequeos arreglos
La nica cuestin pendiente es cmo resolver el problema RMQ en arreglos de tamao n' =

La idea es usar tablas de bsqueda, ya que el nmero total de diferentes arreglos posibles es muy
pequeo.
Observamos que slo tenemos que mirar a los valores relativos en un grupo para encontrar la
ubicacin del elemento mnimo. Esto significa que podemos cambiar todos los valores de modo que
el primer elemento en el grupo es 0. Entonces, una vez que sabemos el destino, podemos buscar en
el arreglo original para encontrar el valor del elemento mnimo.
Ahora vamos a utilizar el hecho de que los elementos del arreglo se diferencian por +1 o -1.
Despus de cambiar el primer valor a 0, ahora hay slo
diferentes grupos inferiores
posibles, desde que todos los grupos son completamente definidos por su larga secuencia n' de +1 y
-1s. Este total de grupos es mucho menor que el nmero actual de grupos!
De hecho, es lo suficientemente pequeo como para que podamos almacenar una tabla de consulta
para cualquiera de los

posibles consultas para cualquiera de los

grupos en

O( (

bits, que cabe fcilmente en O(n) espacio. Ahora, cada grupo puede almacenar

un puntero en la tabla de bsqueda, y todas las consultas pueden ser contestadas en un tiempo
constante con el espacio lineal para el conjunto de los padres, los grupos inferiores, y las tablas.
3.6 Generalizado RMQ
Tenemos LCA usando 1 RMQ en el espacio lineal y tiempo constante. Desde RMQ general, se
puede reducir el uso de reduccin del universo de LCA, tambin tenemos un espacio lineal,
algoritmo RMQ de tiempo constante.
4 Nivel Ancestro (LA)
Primero introducimos la notacin. Sea h(v), la altura de un nodo v en un rbol. Dado un nodo v y el
nivel l, LA(v, l) es el ancestro a de v, tal que h(a) - h(v) = l. Dicho de manera ms simple, subimos
el rbol l niveles desde v y vemos donde terminamos.
Hoy vamos a estudiar una variedad de estructuras de datos con diferentes tiempos de preprocesamiento y de consulta para resolver LA(v, l) consultas. Para una estructura de datos que
requiere f (n) tiempo de consulta y g(n) tiempo de procesamiento previo, vamos a denotar su tiempo
. Los siguientes algoritmos se toman del conjunto encontrado en un
de ejecucin como
artculo de Bender y Farach-Colton [4].
4.1 Algoritmo A:

La idea bsica es usar una tabla de bsqueda con un solo eje correspondiente a los nodos y el otro
eje correspondiente a los niveles. Luego, completamos la tabla utilizando programacin dinmica al
aumentar el nivel. Este es el mtodo de fuerza bruta.

4.2 Algoritmo B:

La idea bsica es utilizar punteros de salto, que son punteros que se almacenan en un nodo y hacen
referencia a uno de los ancestros del nodo. Para cada nodo, creamos punteros de salto a los
antepasados en los niveles 1, 2, 4,. . . , 2k. Las consultas se responden saltando repetidamente desde
un nodo a otro, cada vez que salta ms de la mitad de los niveles restantes entre el ancestro actual y
ancestro meta. Por lo tanto, el nmero del peor caso de saltos est acotada por O(lg n). El
preprocesamiento se realiza mediante el completamiento en los punteros de salto usando
programacin dinmica.
4.3 Algoritmo C:

La idea bsica es usar una descomposicin del camino ms largo, que es una descomposicin en
la que un rbol se divide recursivamente mediante la remocin del camino ms largo que lo
contiene e iterando los subrboles conectados restantes. Cada camino removido se almacena como
un arreglo en orden del camino de arriba a abajo, y cada arreglo tiene un puntero de su primer
elemento (la raz del camino) al mismo padre en el rbol (un elemento del camino-arreglo desde el
nivel recursivo anterior). Una consulta es respondido moviendo hacia arriba en este rbol de
arreglos, atravesando cada arreglo en tiempo O(1). En el peor de los casos la descomposicin del
camino ms largo puede provocar caminos ms largos de tamaos k, k - 1,, 2, 1 por cada uno de

los cuales tiene un solo hijo, lo que resulta en un rbol de arreglos con altura de
. La
construccin de la descomposicin se puede hacer en tiempo lineal precalculando alturas de nodo
una vez, luego volver a utilizar para encontrar los caminos ms largos rpidamente.
4.4 Algoritmo D:

La idea bsica es usar la descomposicin escalera. Esto es similar a la descomposicin del camino
ms largo, pero cada trayectoria se extiende por un factor de dos hacia atrs (hasta el rbol ms all
de la raz del camino ms largo). Si el camino ampliado llega a la raz, que se detenga. Desde la
propiedad escalera, sabemos que el nodo v se encuentra en un camino ms largo de tamao al
menos h(v). Como resultado, uno hace lo sumo O(lg n) saltos de escalera antes de llegar a la raz,
por lo que las consultas se realizan en tiempo O(lg n). El preprocesamiento se realiza de manera
similar al algoritmo C.
4.5 Algoritmo E:

La idea es combinar los punteros de salto (Algoritmo B) y escaleras (Algoritmo D). Cada consulta
utilizar un puntero de salto y una escalera para alcanzar el nodo deseado. En primer lugar un salto
se realiza para conseguir por lo menos hasta la mitad para el antepasado. El nodo salt a ser
contenido en una escalera que tambin contiene el ancestro objetivo, resultando en tiempo de
consulta O(1).
4.6 Algoritmo F:

, pero es
Un algoritmo desarrollado por Dietz [5] tambin resuelve consultas LA en
ms complicado. Aqu se combinan algoritmo E con una reduccin en el nmero de nodos para los
punteros de salto son calculados. La motivacin es que si uno conoce el nivel del antepasado de v
en el nivel l, se conoce el nivel del ancestro de un descendiente de v en el nivel l'. As que calcular
punteros de salto slo para las hojas, lo que garantiza cada nodo tiene un descendiente en este
conjunto. Hasta ahora, el tiempo de preprocesamiento es O(n + L lg n) donde L es el nmero de
hojas. Por desgracia, para un rbol arbitrario, solo tenemos el peor de los casos con cota L = O(n).
4.6.1 Construyendo un rbol con

hojas

Dividir la estructura de rbol en dos componentes: un macro-rbol en la raz, y un conjunto de


micro-rboles (de tamao mximo

) con raz en las hojas del macro-rbol. Considere la

posibilidad de una bsqueda en profundidad, hacer el seguimiento de la orientacin del ith arco,
usando 0 hacia abajo y 1 hacia arriba. Un micro-rbol puede describirse mediante una secuencia
binaria, por ejemplo, W = 001001011 donde por un rbol de tamao n, | W | = 2n - 1. As que una
cota superior el nmero de micro-rboles posibles es
. Pero este
es un flojo lmite superior, ya que no todas las secuencias binarias son posibles, por ejemplo,
00000.... A las secuencias de micro-rboles vlida tiene el mismo nmero de ceros y unos y
cualquier prefijo de una secuencia vlida como al menos tantos ceros como unos.
4.6.2 Uso de macro / micro-rbol para un

solucin a LA

Vamos a utilizar macro / micro-rboles para construir un rbol con

hojas y calcular punteros

de salto slo por sus hojas (tiempo O(n)). Tambin calculamos todos los micro-rboles y sus tablas

de bsqueda (ver algoritmo A) en tiempo


. As que el tiempo total de procesamiento es
O(n). Una consulta de LA(v, l) se lleva a cabo de la siguiente manera: Si v est en el macro-rbol,
saltar a la hoja descendiente de v, y luego saltar de la hoja y subir una escalera. Si v es en un microrbol y LA(v, l) es en el micro-rbol, utilizar la tabla de bsqueda para la hoja. Si v es en un microrbol y LA(v, l) no est en la micro-rbol, entonces saltar a la descendiente de la hoja de v, y luego
saltar de la hoja y subir una escalera.

Referencias
[1] H. Gabow, J. Bentley, R. Tarjan. Scaling and Related Techniques for Geometry Problems. In
STOC 84: Proc. 16th ACM Symp. Theory of Computing, pages 135-143, 1984.
[2] Dov Harel, Robert Endre Tarjan, Fast Algorithms for Finding Nearest Common Ancestors,
SIAM J. Comput. 13(2): 338-355 (1984)
[3] Michael A. Bender, Martin Farach-Colton, The LCA Problem Revisited, LATIN 2000: 88-94
[4] M. Bender, M. Farach-Colton. The Level Ancestor Problem simplified. Lecture Notes in
Computer Science. 321: 5-12. 2004.
[5] P. Dietz. Finding level-ancestors in dynamic trees. Algorithms and Data Structures, 2nd
Workshop WADS 91 Proceedings. Lecture Notes in Computer Science 519: 32-40. 1991.

S-ar putea să vă placă și