Está en la página 1de 19

Range Queries

PUCMM ACM-ICPC Training Camp


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

También podría gustarte