ACM ICPC Training Camp
-
Upload
jorge-nunez-siri -
Category
Documents
-
view
55 -
download
0
description
Transcript of ACM ICPC Training Camp
-
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