Upload
jorge-nunez-siri
View
55
Download
0
Tags:
Embed Size (px)
DESCRIPTION
ACM PUCMM
Citation preview
Range Queries
PUCMM ACM-ICPC Training Camp
BIT, Segment Trees (RMQ)
Range QueriesSe 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 BITHagmos lo primero que naturalmente llega a la mente. Asumamos que tenemos un arreglo X:
Tenemos dos operaciones posibles:
1. Incrementar Xi en K2. 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 BITBIT 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 2Resumen: 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 ndicesPara 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 ndicesPara 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 BITSPOJ - "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 RMQEstructuras 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.
IniciacinEsto es luego de crear M de tamao:
La llamada principal debera ser: initialize(1, 0, n - 1, M, A, N);
Consultas
EjemploPara: [3 1 2]
Problemas a resolver con Segment TreeCOJ - "City Houses"http://coj.uci.cu/24h/problem.xhtml?abb=2067POJ - "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