Download Búsqueda de Rango Ortogonal - Cinvestav
Document related concepts
Transcript
Búsqueda de Rango Ortogonal Pedro Reta Auraham Camacho C INVESTAV-Tamaulipas 8 de marzo del 2013 (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 1 / 102 1 Introducción 2 Búsqueda de Rango Ortogonal 3 Range Trees 4 Higher-Dimensional Range Trees 5 General Set of Points 6 Fractional Cascading (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 2 / 102 Introducción Consultas de Rango Ortogonal Consultas de Rango Ortogonal El material de la clase de hoy está basado en el capítulo 5 del siguiente libro: Mark de Berg, Otfried Cheong, Marc van Kreveld and Mark Overmars. Computational Geometry: Algorithms and Applications. Springer, 3rd edition (April 16, 2008), ISBN-10: 3540779736. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 3 / 102 Introducción Consultas de Rango Ortogonal Consultas de Rango Ortogonal A primera vista parece ser que las bases de datos tienen poca relación con geometría. Sin embargo, muchos tipos de preguntas o queries pueden ser representados geométricamente. Para este fin, se puede realizar la siguiente transformación: registros → puntos consultas sobre registros → consultas sobre puntos (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 4 / 102 Introducción Consultas de Rango Ortogonal Consultas de Rango Ortogonal Considere una base de datos para el manejo de personal. Se desea consultar a todos los empleados que: Nacieron entre 1950 y 1955 Ganen entre $3 000 y $4 000 Para representar esto como un problema geométrico, representamos cada empleado como un punto en el plano. De esta forma, la consulta geométrica consiste en reportar todos los puntos en el plano que cumplan los criterios anteriores. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 5 / 102 Introducción Consultas de Rango Ortogonal Consultas de Rango Ortogonal Figura: Interpretando una consulta geométricamente (2D) (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 6 / 102 Introducción Consultas de Rango Ortogonal Consultas de Rango Ortogonal Ahora, considere agregar otro criterio de búsqueda, el número de hijos por empleado. Se desea consultar a todos los empleados que: Nacieron entre 1950 y 1955 Ganen entre $3 000 y $4 000 Tengan entre 1 y 2 hijos. Para representar esto como un problema geométrico, representamos cada empleado como un punto en el espacio. De esta forma, la consulta geométrica consiste en reportar todos los puntos en el espacio que cumplan los criterios anteriores. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 7 / 102 Introducción Consultas de Rango Ortogonal Consultas de Rango Ortogonal Figura: Interpretando una consulta geométricamente (3D) (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 8 / 102 Introducción Consultas de Rango Ortogonal Consultas de Rango Ortogonal En general, si estamos interesados en responder consultas sobre d campos de un registro se debe efectuar la siguiente transformación: registros → puntos en un espacio d-dimensional De igual forma, una consulta sobre registros se tranforma a una consulta sobre puntos que se encuentran dentro de una caja paralela a los ejes de un espacio d-dimensional. A este tipo de consultas se les conoce como consultas de rango rectangular o consultas de rango ortogonal en geometría computacional. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 9 / 102 Búsqueda de Rango Ortogonal 2 Búsqueda de Rango 1-Dimensional Búsqueda de Rango Ortogonal Búsqueda de Rango 1-Dimensional Ejemplo Nodo de bifurcación vsplit Algoritmo 1DRangeQuery Kd-Trees Algoritmo BuildKdTree Complejidad Región de un nodo (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 10 / 102 Búsqueda de Rango Ortogonal Búsqueda de Rango 1-Dimensional Búsqueda de Rango 1-Dimensional Antes de analizar búsquedas en 2 dimensiones o más, veamos el caso 1-dimensional. Los datos serán representados como un conjunto P de puntos en un espacio 1-dimensional, es decir, números reales sobre la recta. P = {p1 , p2 , ..., pn } Una consulta reporta los puntos dentro de un rectángulo 1-dimensional, es decir, un intervalo [x : x0 ]. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 11 / 102 Búsqueda de Rango Ortogonal Búsqueda de Rango 1-Dimensional Búsqueda de Rango 1-Dimensional Es posible resolver el problema de búsqueda 1-dimensional usando un árbol de búsqueda balanceado T donde: Los nodos hoja representan los puntos de P Los nodos internos representan valores de división para guiar la búsqueda. Denotamos el valor de división almacenado en el nodo v como xv . Asumimos que el subárbol a la izquierda de v contiene valores menores o iguales a v y que el subárbol a la derecha de v contiene valores mayores a v. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 12 / 102 Búsqueda de Rango Ortogonal Búsqueda de Rango 1-Dimensional Búsqueda de Rango 1-Dimensional Figura: Árbol balanceado de búsqueda (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 13 / 102 Búsqueda de Rango Ortogonal Búsqueda de Rango 1-Dimensional Búsqueda de Rango 1-Dimensional Para reportar todos los puntos en una búsqueda de rango [x : x0 ] se procede como sigue. Sean µ y µ0 los nodos hoja en donde termina la búsqueda Entonces, los puntos en el intervalo [x : x0 ] son aquellas hojas entre µ y µ0 1 . 1 µ y µ0 pueden ser límites inclusivos o exclusivos (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 14 / 102 Búsqueda de Rango Ortogonal 2 Ejemplo Búsqueda de Rango Ortogonal Búsqueda de Rango 1-Dimensional Ejemplo Nodo de bifurcación vsplit Algoritmo 1DRangeQuery Kd-Trees Algoritmo BuildKdTree Complejidad Región de un nodo (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 15 / 102 Búsqueda de Rango Ortogonal Ejemplo Ejemplo Se desean conocer los puntos en el rango [18 : 77] dentro de un árbol. Estos puntos serán nodos hoja que pertencen a ciertos subárboles (gris oscuro) en el camino de búsqueda (gris claro). (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 16 / 102 Búsqueda de Rango Ortogonal Ejemplo Ejemplo Figura: Búsqueda de rango 1-dimensional (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 17 / 102 Búsqueda de Rango Ortogonal Ejemplo Ejemplo Por lo tanto, se deben realizar dos tareas: Encontrar un nodo de bifurcación vsplit que divida el camino de búsqueda (color verde). Encontrar los nodos dentro del rango [x : x0 ]. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 18 / 102 Búsqueda de Rango Ortogonal 2 Nodo de bifurcación vsplit Búsqueda de Rango Ortogonal Búsqueda de Rango 1-Dimensional Ejemplo Nodo de bifurcación vsplit Algoritmo 1DRangeQuery Kd-Trees Algoritmo BuildKdTree Complejidad Región de un nodo (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 19 / 102 Búsqueda de Rango Ortogonal Nodo de bifurcación vsplit Nodo de bifurcación vsplit Sean lc(v) y lr(v) los hijos a la izquierda y derecha, respectivamente, de un nodo v. El siguiente algoritmo permite encontrar el nodo vsplit . (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 20 / 102 Búsqueda de Rango Ortogonal Nodo de bifurcación vsplit Nodo de bifurcación vsplit Require: Un árbol T y dos valores x y x0 donde x ≤ x0 . Ensure: El nodo v donde las ramas hacia x y x0 se dividen o la hoja donde ambas ramas terminan. function F IND S PLIT N ONE(T , x, x0 ) v ← root(T ) while v no es hoja and (x0 ≤ x or x > xv ) do if x0 ≤ x then v ← lc(v) else v ← lr(v) return v (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 21 / 102 Búsqueda de Rango Ortogonal 2 Algoritmo 1DRangeQuery Búsqueda de Rango Ortogonal Búsqueda de Rango 1-Dimensional Ejemplo Nodo de bifurcación vsplit Algoritmo 1DRangeQuery Kd-Trees Algoritmo BuildKdTree Complejidad Región de un nodo (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 22 / 102 Búsqueda de Rango Ortogonal Algoritmo 1DRangeQuery Algoritmo 1DRangeQuery Enseguida, hace falta reportar aquellos puntos que se encuentran dentro del rango establecido. Para esto, hacemos uso de vsplit para guiar la búsqueda. El siguiente algoritmo realiza el recorrido por la izquierda del árbol, siendo similar para la búsqueda por la derecha. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 23 / 102 Búsqueda de Rango Ortogonal Algoritmo 1DRangeQuery Algoritmo 1DRangeQuery Require: Un árbol T y dos valores x y x0 donde x ≤ x0 . Ensure: El nodo v donde las ramas hacia x y x0 se dividen o la hoja donde ambas ramas terminan. function 1 D R ANGE Q UERY(T , [x : x0 ]) vsplit ← F IND S PLIT N ODE(T , x, x0 )) if vsplit es hoja then Verificar si vsplit se debe reportar else v ← lc(vsplit ) while v no sea hoja do if x ≤ xv then ReportSubtree(rc(v)) v ← lc(v) else v ← rc(v) Verificar si vsplit se debe reportar Similarmente, recorrer el camnio hacia x0 Reportar los puntos en los subárboles izquierdos (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 24 / 102 Búsqueda de Rango Ortogonal Algoritmo 1DRangeQuery Algoritmo 1DRangeQuery v (C INVESTAV) x ≤ xv Búsqueda de Rango Ortogonal 8 de marzo del 2013 25 / 102 Búsqueda de Rango Ortogonal Algoritmo 1DRangeQuery Algoritmo 1DRangeQuery (C INVESTAV) v x ≤ xv 23 18 ≤ 23 Búsqueda de Rango Ortogonal 8 de marzo del 2013 26 / 102 Búsqueda de Rango Ortogonal Algoritmo 1DRangeQuery Algoritmo 1DRangeQuery (C INVESTAV) v x ≤ xv 23 10 18 18 ≤ 23 10 Búsqueda de Rango Ortogonal 8 de marzo del 2013 27 / 102 Búsqueda de Rango Ortogonal Algoritmo 1DRangeQuery Algoritmo 1DRangeQuery (C INVESTAV) v x ≤ xv 23 10 19 18 18 18 ≤ ≤ 23 10 19 Búsqueda de Rango Ortogonal 8 de marzo del 2013 28 / 102 Búsqueda de Rango Ortogonal Algoritmo 1DRangeQuery Algoritmo 1DRangeQuery (C INVESTAV) v x ≤ xv 23 10 19 23 18 18 18 18 ≤ ≤ ≤ 23 10 19 23 Búsqueda de Rango Ortogonal 8 de marzo del 2013 29 / 102 Búsqueda de Rango Ortogonal 2 Kd-Trees Búsqueda de Rango Ortogonal Búsqueda de Rango 1-Dimensional Ejemplo Nodo de bifurcación vsplit Algoritmo 1DRangeQuery Kd-Trees Algoritmo BuildKdTree Complejidad Región de un nodo (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 30 / 102 Búsqueda de Rango Ortogonal Kd-Trees Kd-Trees Ahora revisemos el caso 2D. Sea P un conjunto de n puntos en el plano. Se asume que los puntos están en posición general. Una consulta de rango rectangular 2-dimensional sobre P reporta aquellos puntos dentro del rectángulo formado por [x : x0 ] × [y : y0 ]. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 31 / 102 Búsqueda de Rango Ortogonal Kd-Trees Kd-Trees Un punto p = (px , py ) se encuentra dentro de [x : x0 ] × [y : y0 ] si y sólo si: px ∈ [x : x0 ] (C INVESTAV) y py ∈ [y : y0 ] Búsqueda de Rango Ortogonal 8 de marzo del 2013 32 / 102 Búsqueda de Rango Ortogonal Kd-Trees Kd-Trees En el caso 1-dimensional el árbol binario de búsqueda se crea a partir de un solo valor, la coordenada x. En el caso 2-dimensional este árbol se debe crear considerando dos coordenadas. Una forma de crear el árbol consiste en dividir el plano en subconjuntos (mitades) sucesivamente. El procedimiento es el siguiente. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 33 / 102 Búsqueda de Rango Ortogonal Kd-Trees Kd-Trees Se divide el conjunto P en dos subconjuntos de aproximadamente el mismo tamaño con una línea l, la cual se almacena en la raíz de T. Se obtienen dos subconjuntos: Pleft contiene aquellos puntos a la izquierda o sobre l Pright contiene aquellos puntos a la derecha de l Enseguida, se divide de nuevo los conjuntos anteriores, pero ahora con una línea horizontal. A medida que se dividen los subconjuntos, aumenta el nivel de profundidad el cual llamaremos depth. Veamos un ejemplo. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 34 / 102 Búsqueda de Rango Ortogonal Kd-Trees Kd-Trees depth = 0 (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 35 / 102 Búsqueda de Rango Ortogonal Kd-Trees Kd-Trees depth = 1 (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 36 / 102 Búsqueda de Rango Ortogonal Kd-Trees Kd-Trees depth = 2 (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 37 / 102 Búsqueda de Rango Ortogonal Kd-Trees Kd-Trees depth = 3 (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 38 / 102 Búsqueda de Rango Ortogonal Kd-Trees Kd-Trees En general, la división del plano se realiza de esta manera: Se divide con una línea vertical si la profundidad es par Se divide con una línea horizontal si la profundidad es impar Al reorganizar los nodos se obtiene el siguiente árbol. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 39 / 102 Búsqueda de Rango Ortogonal Kd-Trees Kd-Trees (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 40 / 102 Búsqueda de Rango Ortogonal Kd-Trees Kd-Trees A un árbol como este se le conoce como árbol-kd o kd-tree. Es posible crear un árbol-kd a partir de un conjunto de puntos P y un nivel de profundidad o recursión. El nivel de profundidad será de utilidad para determinar si se debe dividir a P con una línea horizontal o vertical. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 41 / 102 Búsqueda de Rango Ortogonal 2 Algoritmo BuildKdTree Búsqueda de Rango Ortogonal Búsqueda de Rango 1-Dimensional Ejemplo Nodo de bifurcación vsplit Algoritmo 1DRangeQuery Kd-Trees Algoritmo BuildKdTree Complejidad Región de un nodo (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 42 / 102 Búsqueda de Rango Ortogonal Algoritmo BuildKdTree Algoritmo BuildKdTree A continuación se muestra el algoritmo para la creación de un árbol-kd. Note que está basado en un enfoque divide y vencerás. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 43 / 102 Búsqueda de Rango Ortogonal Algoritmo BuildKdTree Algoritmo BuildKdTree Require: Un conjunto de puntos P y una profundidad depth Ensure: La raíz de un árbol-kd almacenando P function B UILD K D T REE(P, depth) if P contiene sólo un punto then return una hoja con este punto else if depth es par then Dividir P en dos subconjuntos con una línea vertical l Sea P1 el conjunto de puntos a la izquierda o en l Sea P2 el conjunto de puntos a la derecha de l else Dividir P en dos subconjuntos con una línea horizontal l Sea P1 el conjunto de puntos abajo o en l Sea P2 el conjunto de puntos arriba de l vleft ← B UILD K D T REE(P1 , depth + 1) vright ← B UILD K D T REE(P2 , depth + 1) Crear un nodo v que almacene l Colocar vleft a la izquierda de v Colocar vright a la derecha de v return v (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 44 / 102 Búsqueda de Rango Ortogonal 2 Complejidad Búsqueda de Rango Ortogonal Búsqueda de Rango 1-Dimensional Ejemplo Nodo de bifurcación vsplit Algoritmo 1DRangeQuery Kd-Trees Algoritmo BuildKdTree Complejidad Región de un nodo (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 45 / 102 Búsqueda de Rango Ortogonal Complejidad Complejidad Existen básicamente dos tareas relevantes en el algoritmo: División del conjunto consiste en dividir P en P1 y P2 a partir de la mediana. Si P se encuentra ordenado el proceso de encontrar el punto de división será más simple. Esto tomará un tiempo O(n log(n)). Unión de resultados consiste en agregar los subárboles vleft y vright a la raíz v. Esto se puede realizar en tiempo O(n). (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 46 / 102 Búsqueda de Rango Ortogonal Complejidad Complejidad Por lo tanto, la complejidad del algoritmo se resume a la siguiente relación de recurrencia: ( O(1) if n = 1 T(n) = n O(n) + 2T(d 2 e) if n > 1. Siendo esto igual a O(n log(n)) (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 47 / 102 Búsqueda de Rango Ortogonal 2 Región de un nodo Búsqueda de Rango Ortogonal Búsqueda de Rango 1-Dimensional Ejemplo Nodo de bifurcación vsplit Algoritmo 1DRangeQuery Kd-Trees Algoritmo BuildKdTree Complejidad Región de un nodo (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 48 / 102 Búsqueda de Rango Ortogonal Región de un nodo Región de un nodo La región correspondiente a un nodo v es un rectángulo, el cual puede ser abierto en uno o más lados. Denotamos esta región como region(v). (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 49 / 102 Búsqueda de Rango Ortogonal Región de un nodo Región de un nodo Figura: Correspondencia entre una región en el plano y un árbol-kd (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 50 / 102 Range Trees 3 Búsquedas de rango rectangular Range Trees Búsquedas de rango rectangular Subconjuntos canónicos Construcción Consultas (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 51 / 102 Range Trees Búsquedas de rango rectangular Búsquedas de rango rectangular En la sección anterior describimos los árboles Kd, los cuales tienen √ un tiempo de consulta O( n + k). Cuando el número de puntos reportados es pequeño, el tiempo de consulta es relativamente alto. En esta sección describiremos otra estructura de datos para búsquedas en rangos rectangulares, llamada range tree. Tiene un mejor tiempo de consulta, acotado por O(log n2 + k), pero el precio a pagar es un incremento en el almacenamiento de O(n) (para los árboles Kd) a O(n log n). (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 52 / 102 Range Trees Búsquedas de rango rectangular Búsquedas de rango rectangular Sea P un conjunto de n puntos en el plano el cual queremos ejecutar búsquedas de rango rectangular. Definamos el rango de búsqueda como [x : x0 ] × [y : y0 ] Nos concentraremos en encontrar primero los puntos cuya coordenada x estén en [x : x0 ], y no nos preocuparemos por la coordenada y después. Si sólo nos preocupamos por la coordenada x, entonces la búsqueda se reduce a una búsqueda de rango 1-dimensional. Como ya sabemos, para proceder con esta búsqueda basta una búsqueda binaria. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 53 / 102 Range Trees Búsquedas de rango rectangular Búsquedas de rango rectangular Nuestro algoritmo de búsqueda procedía de la manera siguiente: Buscamos con x y x0 en el árbol hasta encontrar un nodo vsplit donde la ruta de búsqueda se bifurque. Desde el hijo izquierdo de vsplit continuamos la búsqueda con x, y en cada nodo v donde la ruta de búsqueda de x siga hacia la izquierda, reportamos todos los puntos en el subárbol izquierdo de v. De manera similar, continuamos la búsqueda con x0 en el hijo derecho de vsplit , y en cada nodo v donde la ruta de búsqueda de x0 siga a la derecha, reportamos todos los puntos en el subárbol izquierdo de v. Finalmente, evaluamos las hojas µ y µ0 donde las dos rutas terminan para ver si contienen un punto en el rango. En efecto seleccionamos una colección de O(log n) subárboles que juntos contienen exactamente los puntos cuya coordenada x cae dentro del rango de la búsqueda. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 54 / 102 Range Trees Búsquedas de rango rectangular Búsquedas de rango rectangular Figura: Representación gráfica de la búsqueda 1-dimensional en un árbol Kd (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 55 / 102 Range Trees 3 Subconjuntos canónicos Range Trees Búsquedas de rango rectangular Subconjuntos canónicos Construcción Consultas (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 56 / 102 Range Trees Subconjuntos canónicos Subconjuntos canónicos Llamaremos subconjunto canónico de v al subconjunto de puntos guardados en las hojas del del subárbol con raíz v. Podemos decir entonces que el subconjunto canónico de la raíz del árbol es el conjunto P y que el subconjunto canónico de una hoja es el punto guardado en esa hoja. Denotamos el subconjunto canónico de v como P(v). Usando este nuevo concepto podemos decir que el subconjunto de puntos cuya coordenada x cae en un rango de búsqueda puede ser expresado como la unión disjunta de O(log n) subconjuntos canónicos. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 57 / 102 Range Trees 3 Construcción Range Trees Búsquedas de rango rectangular Subconjuntos canónicos Construcción Consultas (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 58 / 102 Range Trees Construcción Construcción No estamos interesados en todos los puntos de tal subconjunto canónico P(v), sólo queremos reportar aquellos cuya coordenada y cae dentro del intervalo [y : y0 ]. Lo anterior nos lleva a definir la siguiente estructura de datos para búsquedas en rangos rectangulares en un conjunto P de n puntos en el plano: El árbol principal es un árbol binario balanceado T construido sobre la coordenada x de los puntos en P. Para cualquier nodo interno u hoja v en T , el subconjunto canónico P(v) es guardado en un árbol binario balanceado Tassoc (v) en la coordenada y de los puntos. El nodo v guarda un puntero a la raíz de Tassoc (v), el cual es llamado la estructura asociada de v. Esta estructura de datos es llamada range tree. La siguiente figura ilustra un range tree. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 59 / 102 Range Trees Construcción Construcción Figura: Un range tree 2-dimensional (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 60 / 102 Range Trees Construcción Construcción Aquellas estructuras donde los nodos tienen punteros a estructuras asociadas, son llamadas a menudo estructuras de datos multi-nivel. El árbol principal es entonces llamado el árbol de primer nivel, y las estructuras asociadas son árboles de segundo nivel. Para la construcción de un range tree puede usarse el siguiente algoritmo recursivo, que recibe como entrada un conjunto P := {p1 , ..., pn } de puntos ordenados en su coordenada x y regresa la raíz de un range tree 2-dimensional T de P. Asumiremos posición general. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 61 / 102 Range Trees Construcción Construcción (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 62 / 102 Range Trees Construcción Construcción Lemma Un range tree en un conjunto de n puntos en el plano requiere O(n log n) de almacenamiento. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 63 / 102 Range Trees Construcción Construcción Comprobación Un punto p en P es almacenado sólo en la estructura asociada de nodos en la ruta en T hacia la hoja que contiene p. Por lo tanto, para todos los nodos a una profundidad dada de T , el punto p es guardado en exactamente una estructura asociada. Dado que los range trees 1-dimensionales usan almacenamiento lineal podemos decir que las estructuras asociadas a todos los nodos de cualquier profundidad de T juntos usan O(n) de almacenamiento. La profundidad de T es O(log n). De ahí es que la cantidad total de almacenamiento requerida esta acotada por O(n log n) (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 64 / 102 Range Trees Construcción Construcción Figura: Ilustración del almacenamiento requerido por un range tree (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 65 / 102 Range Trees 3 Consultas Range Trees Búsquedas de rango rectangular Subconjuntos canónicos Construcción Consultas (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 66 / 102 Range Trees Consultas Consultas El algoritmo de consulta primero selecciona O(log n) subconjuntos canónicos que juntos contienen los puntos cuya coordenada x cae dentro del rango [x : x0 ]. De esos puntos reportamos entonces los puntos cuya coordenada y cae en el rango [y : y0 ]. Dado a que para las dos búsquedas podemos usar el algoritmo de búsqueda en una dimensión, este algoritmo es virtualmente el mismo; la única diferencia es el reemplazo de las llamadas a REPORTSUBTREE por las llamadas a 1DRANGEQUERY. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 67 / 102 Range Trees Consultas Consultas (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 68 / 102 Range Trees Consultas Consultas Lemma Una consulta con un rectángulo de ejes paralelos en un range tree almacenando n puntos toma tiempo O(log2 n + k), donde k es el número de puntos reportados. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 69 / 102 Range Trees Consultas Consultas Comprobación En cada nodo v del árbol principal T usamos tiempo constante para decidir dónde continúa la ruta de búsqueda, y posiblemente llamemos a 1DRANGEQUERY. El tiempo que toma esta llamada recursiva es O(log n + kv ), donde kv es el número de puntos reportados en esta llamada. Por lo tanto, el tiempo total puede ser expresado por, X O(log n + kv ) v (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 70 / 102 Range Trees Consultas Consultas Teorema Sea P un conjunto de n puntos en el plano. Un range tree para P usa un almacenamiento O(n log n) y puede ser construido en tiempo O(n log n). Al hacer una consulta en este range tree se pueden reportar los puntos en P que caen en un rango de búsqueda rectangular en tiempo O(log2 n + k), donde k es el número de puntos reportados. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 71 / 102 Higher-Dimensional Range Trees 4 Construcción Higher-Dimensional Range Trees Construcción Consultas (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 72 / 102 Higher-Dimensional Range Trees Construcción Construcción Sea P un conjunto de puntos en un espacio d-dimensional. Construimos un árbol binario balanceado en la primera coordenada de los puntos. El subconjunto canónico P(v) de un nodo v en el primer nivel, consiste de los puntos almacenados en las hojas del subárbol con raíz v. Para cada nodo v construimos una estructura asociada Tassoc (v); el árbol de segundo nivel Tassoc es un range tree (d − 1)-dimensional para los puntos en P(v), restringidos a su últimas d − 1 coordenadas. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 73 / 102 Higher-Dimensional Range Trees Construcción Construcción El range tree (d − 1)-dimensional es construido recursivamente de la misma forma: es un árbol binario balanceado en la segunda coordenada de los puntos, en el que cada nodo tiene un puntero a un range tree (d − 2)-dimensional de puntos en su subárbol, restringido hasta las últimas (d − 2) coordenadas. La recurrencia se detiene cuando quedan sólo puntos restringidos a su última coordenada y son guardados en un range tree 1-dimensional. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 74 / 102 Higher-Dimensional Range Trees Construcción Construcción Figura: Representación de un range tree d-dimensional (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 75 / 102 Higher-Dimensional Range Trees 4 Consultas Higher-Dimensional Range Trees Construcción Consultas (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 76 / 102 Higher-Dimensional Range Trees Consultas Consultas El algoritmo de consulta es muy similar al caso 2-dimensional. Usamos el árbol de primer nivel para localizar O(log n) nodos cuyos subconjuntos canónicos contienen juntos todos los puntos cuyas primeras coordenadas caen dentro del rango correcto. Esos subconjuntos son consultados posteriormente, haciendo una búsqueda de rango en las estructuras de segundo nivel correspondientes. En cada estructura de segundo nivel, seleccionamos O(log n) subconjuntos canónicos. Esto significa que hay O(log2 n) subconjuntos canónicos en las estructuras de segundo nivel en total. Juntos, contienen todos los puntos cuya primera y segunda coordenada caen dentro de los rangos correctos. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 77 / 102 Higher-Dimensional Range Trees Consultas Consultas Las estructuras de tercer nivel son consultadas con el rango para la tercera coordenada y así sucesivamente, hasta llegar a los árboles 1-dimensionales. En ellos encontramos los puntos cuya última coordenada cae dentro del rango correcto y los reportamos. Teorema Sea P un conjunto de n puntos en un espacio d-dimensional, donde d ≥ 2. Un range tree para P usa almacenamiento O(n logd−1 n) y puede ser construido en tiempo O(n logd−1 n). Se pueden reportar los puntos en P que caen en una búsqueda de rango rectangular en tiempo O(logd n + k), donde k es el número de puntos reportados. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 78 / 102 General Set of Points 5 General Set of Points (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 79 / 102 General Set of Points Hasta ahora se ha asumido que ningún par de puntos tienen coordenadas x o y iguales, lo cual no es nada realista. Pero esto es relativamente fácil de remediar. Si reemplazamos las coordenadas, las cuales son números reales, por elementos del espacio de números compuestos. Los elementos de dicho espacio son pares de reales. El número compuesto de dos reales a y b se denota por (a|b). Definimos entonces un orden total en el espacio de números compuestos usando un orden lexicográfico, de tal forma que para dos números compuestos (a|b) y (a0 |b0 ), tenemos (a|b) < (a0 |b0 ) ⇔ a < a0 or (a = a0 and b < b0 ) (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 80 / 102 General Set of Points Asumimos un conjunto P de n puntos en el plano. Los puntos son distintos pero muchos tienen la misma coordenada x o y. Reemplazamos cada punto p := (px , py ) por un nuevo punto p̂ := ((px |py ), (py |px )). De esta forma obtenemos el conjunto P̂ de n puntos. La primera coordenada de cualesquiera dos puntos en P̂ son distintas, lo mismo para la segunda coordenada. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 81 / 102 General Set of Points Si suponemos que queremos reportar los puntos de P que caen dentro del rango R := [x : x0 ] × [y : y0 ]. Para este fin, debemos consultar el árbol que se construya para P̂. Esto significa que también tenemos que transformar el rango. El rango transformado R̂ es definido como sigue: R̂ := [(x| − ∞) : (x0 | + ∞)] × [(y| − ∞) : (y0 | + ∞)] (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 82 / 102 General Set of Points Lemma Sea p un punto y R un rango rectangular. Entonces: p ∈ R ⇔ p̂ ∈ R̂ (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 83 / 102 General Set of Points Demostración Sea R := [x : x0 ] × [y : y0 ] y sea p := (px , py ). Por definición p cae en R si y sólo si x ≤ px ≤ x0 y y ≤ py ≤ y0 . Esto es evidente si y sólo si (x| − ∞) ≤ (px |py ) ≤ (x0 | + ∞) y (y| − ∞) ≤ (py |px ) ≤ (y0 | + ∞), esto es, si y sólo si p̂ está dentro de R̂. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 84 / 102 Fractional Cascading 6 Fractional Cascading (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 85 / 102 Fractional Cascading Si retomamos el concepto de range tree, recordamos que el tiempo de búsqueda en una de las estructuras Tassoc (v) es una búsqueda de rango 1-dimensional la cual toma tiempo O(log n + kv ) donde kv es el número de puntos reportados. Por lo tanto el tiempo total de la búsqueda en el árbol 2-dimensional es O(log2 n + k). Si pudiésemos buscar en las estructuras asociadas en un tiempo O(1 + kv ), podríamos reducir el tiempo total a O(log n + k). En general no es posible responder a una búsqueda 1-dimensional en tiempo O(1 + k), con k el número de respuestas. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 86 / 102 Fractional Cascading La ventaja que se tiene es que en una búsqueda d-dimensional se incluyen muchas búsquedas 1-dimensionales con el mismo rango y podemos usar el resultado de una para acelerar las otras. Ilustrando, sean S1 y S2 dos conjuntos de objetos, donde cada objeto tiene una llave que es un número real. Esos objetos están guardados en arreglos A1 y A2 . Supongamos que queremos reportar todos los objetos de S1 y S2 que caen dentro del rango [y : y0 ]. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 87 / 102 Fractional Cascading Hacemos una búsqueda binaria con y en A1 para encontrar la llave mas pequeña más grande o igual que y. Desde ese punto caminamos en el arreglo hacia la derecha reportando todos los objetos, hasta encontrar una llave mayor que y0 . Los objetos de S2 pueden ser reportados de manera similar. Por lo tanto el tiempo de consulta sería O(k) mas el tiempo por las dos consultas binarias, en A1 y A2 Sin embargo, si las llaves de los objetos en S2 son un subconjunto de las llaves de los objetos de S1 , podríamos evadir la segunda búsqueda binaria de la siguiente forma: (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 88 / 102 Fractional Cascading Si añadimos punteros desde las entradas en A1 a las entradas en A2 : si A1 [i] guarda un objeto con una llave yi , entonces guardamos un puntero a la entrada en A2 con la llave mas pequeña, mayor o igual a yi . Si no existe tal llave, entonces el puntero de A1 [i] es nulo. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 89 / 102 Fractional Cascading Figura: Acelerando la búsqueda añadiendo punteros (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 90 / 102 Fractional Cascading Para buscar los puntos en el intervalo [y : y0 ] Para reportar los objetos en S1 se procede de la misma forma: una búsqueda binaria en A1 . Para reportar los objetos de S2 , buscamos y en A1 para terminar en A1 [i]. Como la llave de esa entrada es la más pequeña en S1 que es mayor o igual que y y como las llaves de S2 son un subconjunto de las llaves en S1 , significa que el puntero de A1 [i] debe apuntar llave más pequeña con valor mayor o igual que y. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 91 / 102 Fractional Cascading Por lo tanto, podemos seguir este puntero y desde ahí empezar a caminar a la derecha en A2 . De esta forma la búsqueda binaria en A2 es evitada, y reportar los objetos de S2 sólo toma tiempo O(1 + k), con k el número de puntos reportados (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 92 / 102 Fractional Cascading Regresando a los range trees, la observación crucial que debemos hacer es que existen subconjuntos canónicos P(lc(v)) y P(rc(v)) ambos subconjuntos de P(v). Por lo que podemos usar la misma idea para acelerar la búsqueda. La implementación requiere unas pocas observaciones Sea T un range tree con un conjunto P de n puntos en el plano Cada subconjunto canónico es almacenado en una estructura asociada, pero en vez de usar un arbol binario como estructura, usaremos un arreglo A(v) (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 93 / 102 Fractional Cascading Cada entrada en un arreglo A(v) guarda dos punteros: uno a A(lc(v)) y otro hacia A(rc(v)). De manera más precisa, añadimos los siguientes punteros. Supongamos que A(v)[i] guarda un punto p. Guardamos un puntero de A(v)[i] a la entrada de A(lc(v)) tal que la coordenada y del punto p0 guardado ahí, sea la más pequeña mayor o igual a py . El puntero hacia A(rc(v)) es definido de la misma forma, apunta a la entrada tal que la coordenada y del punto guardado ahí sea la más chica mayor o igual que py . (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 94 / 102 Fractional Cascading Esta versión modificada del range tree es llamada layered range tree. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 95 / 102 Fractional Cascading Figura: El árbol principal de un layered range tree: las hojas sólo muestran las coordenadas x (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 96 / 102 Fractional Cascading Figura: Los arreglos asociados con los nodos del árbol principal, con la coordenada y de los subconjuntos canónicos en orden (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 97 / 102 Fractional Cascading Ahora veamos cómo responder a una búsqueda en un rango [x : x0 ] × [y : y0 ] en un árbol de este tipo. Como ya vimos, buscamos con x y x0 en el árbol principal T para determinar O(log n) nodos que juntos contienen los puntos cuyas coordenadas x caen dentro del rango [x : x0 ]. (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 98 / 102 Fractional Cascading Tales nodos se encuentran de la siguiente manera: Sea vsplit el nodo donde las dos rutas se parten Los nodos que nos interesan son los que están por debajo de vsplit En vsplit encontramos la entrada en A(vsplit ) cuya coordenada y es la menor, mayor o igual que y, esto se puede encontrar en tiempo O(log n) con búsqueda binaria (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 99 / 102 Fractional Cascading Mientras seguimos buscando en con x y x0 en el árbol principal, vamos tomando registro de la entrada en los arreglos asociados cuya coordenada y es la menor, mayor o igual a y Esto puede mantenerse en tiempo constante siguiendo los punteros guardados en los arreglos Ahora, sea v uno de los O(log n) nodos que seleccionamos. Debemos reportar los puntos guardados en A(v) cuya coordenada y caiga en el rango [y : y0 ] Para esto basta encontrar el punto con la menor coordenada y, mayor o igual a y para después caminar a la derecha del arreglo reportando los puntos mientras su coordenada y sea menor o igual que y0 (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 100 / 102 Fractional Cascading Por lo tanto, podemos reportar los puntos de A(v) cuya coordenada y esté en el rango [y : y0 ] en tiempo O(1 + kv ), donde kv es el número de puntos reportados en el nodo v El tiempo total de búsqueda entonces se vuelve O(log n + k) (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 101 / 102 Fractional Cascading Teorema Sea P un conjunto de n puntos en un espacio d-dimensional, donde d ≥ 2. Un layered range tree para P usa almacenamiento O(n logd−1 n) y puede ser construido en tiempo O(n logd−1 n). Con este árbol podemos reportar los puntos de P que caen en un rango rectangular en tiempo O(logd−1 n + k), donde k es el número de puntos reportados (C INVESTAV) Búsqueda de Rango Ortogonal 8 de marzo del 2013 102 / 102