0 calificaciones0% encontró este documento útil (0 votos)
71 vistas19 páginas
Las consultas de rango se refieren a consultas sobre un subconjunto o intervalo de datos. Una consulta de rango incluye el arreglo, los límites del rango y la función de consulta. Las estructuras de datos como los árboles binarios indexados y los árboles de segmentos permiten realizar consultas de rango de manera eficiente en tiempo logarítmico. Los árboles binarios indexados permiten actualizaciones y sumas parciales en tiempo constante y logarítmico respectivamente, mientras que los árboles de segmentos son útiles para consultas
Las consultas de rango se refieren a consultas sobre un subconjunto o intervalo de datos. Una consulta de rango incluye el arreglo, los límites del rango y la función de consulta. Las estructuras de datos como los árboles binarios indexados y los árboles de segmentos permiten realizar consultas de rango de manera eficiente en tiempo logarítmico. Los árboles binarios indexados permiten actualizaciones y sumas parciales en tiempo constante y logarítmico respectivamente, mientras que los árboles de segmentos son útiles para consultas
Las consultas de rango se refieren a consultas sobre un subconjunto o intervalo de datos. Una consulta de rango incluye el arreglo, los límites del rango y la función de consulta. Las estructuras de datos como los árboles binarios indexados y los árboles de segmentos permiten realizar consultas de rango de manera eficiente en tiempo logarítmico. Los árboles binarios indexados permiten actualizaciones y sumas parciales en tiempo constante y logarítmico respectivamente, mientras que los árboles de segmentos son útiles para consultas
BIT, Segment Trees (RMQ) Range Queries Se refiere al diseo de estructuras de datos para responder eficientemente consultas sobre algn intervalo o sub-conjunto de una data. Definicin: Un Range Query es un 5-tupla RQ = {A, S, i, j, f} donde: A es el arreglo A = [a0, a1, a2, ..., an-1] sobre el cual se realiza la consulta. S es el conjunto de donde provienen los elementos de A. i es el lmite izquierdo del rango a consultar. j es el lmite derecho del rango a consultar. es la funcin de consulta definida sobre el arreglo A de elementos que provienen de S. Ejemplos de Range Queries sobre A = [1, 2, 8, 3, 9, 2, 9]: Cul es el mnimo elemento entre [2,5]: 2. Cul es el mximo elemento enbre [0, 3]: 8. Cul es la suma cumulativa de [0, 2]: 11. Binary Indexed Trees (BIT) Estructuras para el clculo y manipulacin eficiente de sumas cumulativas (tambin conocidas como sumas de prefijos). Note que una suma cumulativa es lo mismo que una suma parcial de una serie. O sea: Tambin conocidos como "Fenwick Trees" en pases de Europa del este. Justificacin para uso de BIT Hagmos lo primero que naturalmente llega a la mente. Asumamos que tenemos un arreglo X: Tenemos dos operaciones posibles: 1. Incrementar Xi en K 2. Sumar desde Xi hasta Xj La operacin (1) toma O(1) y la operacin (2) toma O(n). Si tenemos m operaciones de tipo (2) a realizar, esta solucin toma O(m * n). Posiblemente lo segundo que llega a la mente es tener un arreglo Y[0..n - 1] que almacene las sumas parciales X[0..i] para cada i. Construir este arreglo toma O(n). Sin embargo, si tenemos m actualizaciones, esto tomara O(m * n). BIT permite todo lo anterior en O(m log n) peor caso. Bsicos de BIT BIT ofrece solamente dos operaciones: SET(i,v): incrementa X[i] en v. GET(i): Devuelve X[0] + X[1] + ... + X[i] Nmeros Binarios y Potencias de 2 Resumen: Los nmeros enteros se pueden representar como sumas de potencias de dos. Ejemplo: 22 = 4^2 + 2^2 + 2. Aprovechando esta relacin, la manera de conseguir nuestra suma sera: Para el mismo 22, por ejemplo: S(1, 22) = S(1, 16) + S(17, 20) + S(21, 22) GET: Consiguiendo los ndices Para conseguir los ndices de BIT al hacer una suma, podemos utilizar funciones boolenas bitwise de nuestros lenguajes de programacin: i = i - (i & -i) SET: Consiguiendo los ndices Para conseguir los ndices de BIT al hacer una actualizacin, podemos utilizar funciones boolenas bitwise de nuestros lenguajes de programacin: i = i + (i & -i) Implementacin en C++ Versin en vivo: http://ideone.com/QP0Ol0 Problemas a resolver con BIT SPOJ - "Increasing Subsequences" : http://www.spoj.pl/problems/INCSEQ/ SPOJ - "Distinct Increasing Subsequenes": http://www.spoj.pl/problems/INCDSEQ/ TOJ - "In The Army Now": http://acm.timus.ru/problem.aspx?space=1&num=1090 Segment Trees y RMQ Estructuras de datos para almacenar intervalos (segmentos): Cul segmento contiene al punto x? Usualmente el punto "x" es una consulta del mnimo o mximo sobre un rango. Idneos para RMQ Los rboles de segmento utilizan espacio proporcional a la altura de un rbol binario completo. En total precisan de [0, 2^(log2 N +1))]. Preparar este espacio toma O(n). Posteriormente, cada operacin de consulta se realiza en O(log n). Para una serie de m consultas, el tiempo en el peor caso sera de O(m log n). Bsicos de los Segment Trees Cada rango se enumera iniciando con el rango 1 (el rango completo). En un estilo divide y vencers, el rango se va dividiendo en dos rangos de tamao |n / 2| hasta llegar a la unidad. La enumeracin de los prximos rangos se hace de acuerdo en su orden de aparicin en el rbol de recursin formado por el proceso D&V (izquierda a derecha, de abajo hacia arriba). Usualmente la estructura es esttica. Una vez formado el Segment Tree, no se modifica. Iniciacin Esto es luego de crear M de tamao: La llamada principal debera ser: initialize(1, 0, n - 1, M, A, N); Consultas Ejemplo Para: [3 1 2] Problemas a resolver con Segment Tree COJ - "City Houses" http://coj.uci.cu/24h/problem.xhtml?abb=2067 POJ - "Balanced Line-Up" http://poj.org/problem?id=3264 Notas finales Se puede utilizar tanto BIT como Segment Tree para sumas cumulativas. En la prctica generalmente BIT funciona mejor para bsquedas cumulativas. Bibliografa danielp. Range Minimum Query and Lowest Common Ancestor. Retrieved Oct 24th, 2012, from http://community.topcoder.com/tc? module=Static&d1=tutorials&d2=lowestCommonAncestor#Segment_Trees gvikey. Basic Binary Indexed Tree. Retrieved Oct 24th, 2012, from http://codeforces. ru/blog/entry/619?locale=en Wikipedia. Range Queries. Retrieved Oct 24th, 2012, from http://en.wikipedia. org/wiki/Range_Queries