0% encontró este documento útil (0 votos)
10 vistas278 páginas

Tutorial BD

Base de datos

Cargado por

PatoPepe
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
10 vistas278 páginas

Tutorial BD

Base de datos

Cargado por

PatoPepe
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Estructuras de Datos

Compactas
Gonzalo Navarro
[Link]/gnavarro
gnavarro@[Link]
(DCC)
Departamento de Ciencias de la Computacion
Universidad de Chile

Sponsors:

Mapa

Parte I: Secuencias
y Motivacion

Introduccion
La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos
Secuencias de Bits
Rank y Select, aplicaciones a Hashing, Sumas, Pred/Succ
Rank y Select sobre Secuencias Comprimidas

Secuencias Dinamicas,
aplicaciones a Sumas Parciales
Secuencias de Smbolos
Recurriendo a Secuencias de Bits
El Wavelet Tree, aplicaciones a Geometra y Relaciones
Revisitando las Secuencias de Bits
G. Navarro

Estructuras de Datos Compactas

Mapa

Parte I: Secuencias
y Motivacion

Introduccion
La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos
Secuencias de Bits
Rank y Select, aplicaciones a Hashing, Sumas, Pred/Succ
Rank y Select sobre Secuencias Comprimidas

Secuencias Dinamicas,
aplicaciones a Sumas Parciales
Secuencias de Smbolos
Recurriendo a Secuencias de Bits
El Wavelet Tree, aplicaciones a Geometra y Relaciones
Revisitando las Secuencias de Bits
G. Navarro

Estructuras de Datos Compactas

Mapa

Parte I: Secuencias
y Motivacion

Introduccion
La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos
Secuencias de Bits
Rank y Select, aplicaciones a Hashing, Sumas, Pred/Succ
Rank y Select sobre Secuencias Comprimidas

Secuencias Dinamicas,
aplicaciones a Sumas Parciales
Secuencias de Smbolos
Recurriendo a Secuencias de Bits
El Wavelet Tree, aplicaciones a Geometra y Relaciones
Revisitando las Secuencias de Bits
G. Navarro

Estructuras de Datos Compactas

Mapa

Parte II: Otras Estructuras


Arboles
con Parentesis

Representacion

a Mnimos en Rangos
Navegando en Parentesis,
aplicacion
de Arboles
Otra Representacion
Textos
El Arreglo de Sufijos Comprimido
de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair
G. Navarro

Estructuras de Datos Compactas

Mapa

Parte II: Otras Estructuras


Arboles
con Parentesis

Representacion

a Mnimos en Rangos
Navegando en Parentesis,
aplicacion
de Arboles
Otra Representacion
Textos
El Arreglo de Sufijos Comprimido
de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair
G. Navarro

Estructuras de Datos Compactas

Mapa

Parte II: Otras Estructuras


Arboles
con Parentesis

Representacion

a Mnimos en Rangos
Navegando en Parentesis,
aplicacion
de Arboles
Otra Representacion
Textos
El Arreglo de Sufijos Comprimido
de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos

Parte I: Secuencias
y Motivacion

Introduccion
La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos
Secuencias de Bits
Rank y Select, aplicaciones a Hashing, Sumas, Pred/Succ
Rank y Select sobre Secuencias Comprimidas

Secuencias Dinamicas,
aplicaciones a Sumas Parciales
Secuencias de Smbolos
Recurriendo a Secuencias de Bits
El Wavelet Tree, aplicaciones a Geometra y Relaciones
Revisitando las Secuencias de Bits
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos

La Jerarqua de Memoria
de los Circuitos: Ley de Moore (1965)
Evolucion
El numero
de transistores que consigue el menor costo por

transistor en un circuito integrado se duplica cada 24 meses

Este grafico
y los siguientes sobre este
tema se han extrado de Wikipedia.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos

La Jerarqua de Memoria
Consecuencias de la Ley de Moore
I

Las memorias, a igual costo, son cada vez mayores.

I
I

(Incluso a menor costo son mayores!)


potentes.
Las CPUs, igualmente, son mas

Se cree que valdra al menos hasta el 2020.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos

La Jerarqua de Memoria
Todo sigue la Ley de Moore?
I

No!

Discos (tiempos de seek, por ejemplo).

Velocidad de acceso a la RAM.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos

La Jerarqua de Memoria
Actual
Situacion
I

Es posible, en general, tener tanta memoria como se


quiera.

lenta en comparacion
con la
Pero esta
es cada vez mas
CPU.
Aparecen nuevas memorias (caches)
I
I
I

rapidas

Mas
(por tecnologa y distancia a la CPU).
caras (por tecnologa).
Mas
pequenas
(por distancia a la CPU y precio).
Mas

Por el compromiso velocidad/distancia, aparecen multiples

niveles de cache.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos

La Jerarqua de Memoria
Actual
Situacion
I

Numeros
gruesos y (relativamente) actuales:

I
I
I
I
I

Unos pocos registros de CPU, menos de 1 nanosegundo.


Unos pocos KBs de cache L1, unos 10 nanosegundos.
Unos pocos MBs de cache L2, unos 30 nanosegundos.
Unos pocos GBs de RAM, unos 60 nanosegundos.
Unos pocos TBs de disco, unos 10 milisegundos de
unos 500 nanosegundos por palabra
latencia, mas
transferida.

relevante que nunca!


La jerarqua de memoria es mas
La diferencia de tiempo entre tener un dato en RAM
versus traerlo de disco es comparable a la de tomar el
sacapuntas del escritorio donde estoy sentado versus
a la China para ir a buscarlo y regresar.
tomarme un avion
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos

La Jerarqua de Memoria

Y el Futuro?
I

Un poco de ciencia ficcion:


I
I
I

Vivimos en un universo tridimensional.

Si empaqueto n objetos de cierto tamano...


lejano es (n1/3 ).
... la distancia del centro al mas

pequenas
y rapidas...

Siempre habra memorias mas


grandes y lentas.
... versus mas

Incluso sin considerar razones economicas!

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos

Parte I: Secuencias
y Motivacion

Introduccion
La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos
Secuencias de Bits
Rank y Select, aplicaciones a Hashing, Sumas, Pred/Succ
Rank y Select sobre Secuencias Comprimidas

Secuencias Dinamicas,
aplicaciones a Sumas Parciales
Secuencias de Smbolos
Recurriendo a Secuencias de Bits
El Wavelet Tree, aplicaciones a Geometra y Relaciones
Revisitando las Secuencias de Bits
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos

Estructuras de Datos Compactas


Son estructuras de datos...
I

Modificadas para ocupar poco espacio.

Y eso no es compresion?

No: deben retener su funcionalidad y acceso directo.

si la memoria es tan barata?


Para que,

Mejoran el rendimiento debido a la jerarqua de memoria.

Especialmente si logramos operar en RAM algo que


necesitara del disco!

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos

Estructuras de Datos Compactas


Un ejemplo motivante...
I

El genoma humano, recientemente decodificado.

Contiene 3 mil millones de bases.

Cada base necesita 2 bits (letras A, C, G, T).

Cabe holgadamente en una RAM de 1 GB.

Pero los biologos


necesitan hacer busquedas
complejas en el!

Estas operaciones seran lentsimas en forma secuencial...


I

mas
larga requiere
por ejemplo, obtener la autorrepeticion

tiempo cuadratico
sin un ndice apropiado;

con el ndice adecuado se hace facilmente


en tiempo lineal.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos

Estructuras de Datos Compactas


I

I
I
I

El ndice que resuelve todos esos problemas es el arbol


de
sufijos.

Pero este
requiere entre 30 GB y 60 GB de memoria!
Para peor, no se lleva bien con el disco.

puede usarse para secuencias de


En la practica,
solo
juguete, que hasta podran tratarse secuencialmente.
Usando estructuras de datos compactas, cabe en una
RAM de 2 GB.
lento que el arbol

Es mucho mas
de sufijos clasico
en una
misma memoria...
rapido

pero es infinitamente mas


corriendo en RAM que el
original en disco.
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos

Estructuras de Datos Compactas


Otro ejemplo motivante...

El grafo de la Web contena el 2004 unos 11.5 mil millones


de nodos y 150 mil millones de links.
o menos segun
Crece mas
la Ley de Moore.

la Web estatica

Esto considera solo


indexada!

Necesitara unos 600 GB de RAM para almacenarse.

Gigantes como Google y Yahoo! lo usan para calcular


PageRank, encontrar comunidades, etc.

Usando estructuras de datos compactas, cabe en unos


100 GB.
permite ademas
navegar el grafo hacia
Y con un poco mas
y otras operaciones utiles.
atras,

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos

Mapa del Tutorial


convencidos...
Ahora que estan
I

Revisaremos los avances en la ultima


decada
en diversas

estructuras de datos compactas.


herramientas teoricas

Estas les daran


y practicas
para
de
aprovechar la jerarqua de memoria en el diseno
algoritmos y estructuras de datos.
Veremos estructuras compactas para:
I
I
I
I
I

Manipular secuencias de bits


Manipular secuencias de smbolos

Navegar en arboles
Buscar en textos
Navegar en grafos

Y aplicaciones a hashing, conjuntos, sumas parciales,

geometra, permutaciones, y mas.


G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos

Parte I: Secuencias
y Motivacion

Introduccion
La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos
Secuencias de Bits
Rank y Select, aplicaciones a Hashing, Sumas, Pred/Succ
Rank y Select sobre Secuencias Comprimidas

Secuencias Dinamicas,
aplicaciones a Sumas Parciales
Secuencias de Smbolos
Recurriendo a Secuencias de Bits
El Wavelet Tree, aplicaciones a Geometra y Relaciones
Revisitando las Secuencias de Bits
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos

Entropa Emprica
I

Entropa binaria: si hay n0 ceros y n1 unos en una


secuencia de bits B (n0 + n1 = n = |B|)
 


n
n1
n
1
n
log n
n0
log
+
log
=
log
+O
H0 (B) =
n
n0
n
n1
n
n0
n
(utilizaremos logaritmos en base 2 por defecto).

Entropa de orden cero: si hay nc ocurrencias de c en S


(secuencia de smbolos sobre un alfabeto ),
H0 (S) =

X nc
c

log

n
nc

de que asigne
Cota inferior a cualquier codificacion

siempre el mismo codigo


al mismo smbolo (ej. Huffman).
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos

Entropa Emprica

Entropa de orden k : si SA es la secuencia de los


caracteres que siguen a las ocurrencias de A en S,
Hk (S) =

1 X
|SA |H0 (SA )
n
k
A

Cota inferior a codificaciones que consideran los k


smbolos precedentes (ej. PPM).

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos

Modelo RAM y Analisis


Asintotico
I
I

Mediremos el espacio en bits.


Modelo RAM:
I

Necesitamos log n bits para direccionar en una memoria de


n bits.
Si direccionamos n bits, consideraremos que el computador
puede manipular O(log n) bits en tiempo constante.

O(n) significa limitado superiormente por c n para alguna


constante (positiva) c a partir de un cierto n = n0 .

o(n) significa que, dividido por n, tiende a cero cuando n


tiende a infinito.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Parte I: Secuencias
y Motivacion

Introduccion
La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos
Secuencias de Bits
Rank y Select, aplicaciones a Hashing, Sumas, Pred/Succ
Rank y Select sobre Secuencias Comprimidas

Secuencias Dinamicas,
aplicaciones a Sumas Parciales
Secuencias de Smbolos
Recurriendo a Secuencias de Bits
El Wavelet Tree, aplicaciones a Geometra y Relaciones
Revisitando las Secuencias de Bits
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Secuencias de Bits
I
I

Consideremos una secuencia de n bits, B[1, n].


Nos interesan las siguientes operaciones sobre B:
I
I

Algunas propiedades simples:


I
I
I
I
I

rankb (B, i): cuantas


veces aparece el bit b en B[1, i]?

selectb (B, i): donde


ocurre el bit b por i-esima
vez en B?
rank0 (B, i) = i rank1 (B, i).
B[i] = rank1 (B, i) rank1 (B, i 1) (sup. rankb (B, 0) = 0).
rankb (B, selectb (B, i)) = i.
Si B[i] = b, selectb (B, rankb (B, i)) = i.
En general, selectb (B, rankb (B, i)) i.

Cuando no mencionemos b supondremos b = 1.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Secuencias de Bits
rank(B,13) = 7
rank(B,20) = 7

00110011101010000000110010011110

select(B,1) = 3
select(B,7) = 13
select(B,8) = 21

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Secuencias de Bits
Resultado
I
I

I
I

Se puede responder rank y select en tiempo constante.


almacenando todas las respuestas en
Esto es facil
O(n log n) bits, pero solamente se necesitan


n log log n
= n + o(n)
n+O
log n
un extra
bits de espacio (los n bits para B[1, n] mas
sublineal).

Las soluciones son practicas


(especialmente rank).
Veremos algunas de las muchas aplicaciones antes de

mostrar como
se logra este resultado.
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank y Select

Hashing perfecto
Una aplicacion:
I

Si el universo tiene n claves (por ejemplo [1, n]),

y queremos almacenar t elementos con r bits de datos,


hashing perfecto nos ofrece:

I
I
I

O(tr ) bits de espacio,


tiempo de acceso constante
aleatorizada o muy costosa.
construccion

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank y Select
I

usando rank:
Consideremos una solucion
I
I
I
I
I

I
I

Tendremos un arreglo A[1, t] con los datos,


un bitmap B[1, n] que marque las claves que existen.
mas
Entonces nuestro dato con clave i esta en A[rank (B, i)].
Y esta en el conjunto si B[i] = 1.
Total: tr + n + o(n) bits.

es interesante si n/t no es muy grande


La solucion
comparado con r .
es mucho mas
simple.
Ademas
Incluso podramos lograr tr + O(t log(n/t)) bits (menos de
un puntero extra por elemento).

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank y Select
Hashing perfecto
rank(B,7) = 3

00110011101010000000110010011110

Data (3)

Data (4)

Data (7)

G. Navarro

. . .

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank y Select

Sumas parciales
Otra aplicacion:
I
I

Supongamos que tenemos t numeros


A[1, t] que suman n,

y queremos hacer dos tipos de preguntas sobre el arreglo:


I
I

Pr

Sum: Dado r , cuanto


es j=1 A[j] ?
Pr
Search: Dado s, para que r ocurre que j=1 A[j] > s ?

responderlas en tiempo constante usando


Es facil
t log n + n log t bits...

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank y Select
I

Supongamos que los A[i] son no negativos.

Con rank y select las podemos responder usando


n + t + o(n) bits!
P
Marcar con 1, en B[1, n + t], las posiciones r + rj=1 A[j].

Entonces
I
I

Sum: select1 (B, r ) r .


Search: 1 + rank1 (B, select0 (B, s)).

se
Y si n + t bits parece mucho, mostraremos que tambien
n+t
puede hacer usando t log t bits!

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank y Select
Sumas parciales

. . .

select(B,6)6 = 116 = 5

0 0 1 1 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 1 1 1 0

1+rank(select0 (B,10)) = 1+rank(B,17) = 8

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank y Select
Predecesor y sucesor
Y otra mas:
I
I

Tenemos t elementos del conjunto [1, n],


y queremos hacer dos tipos de preguntas sobre el
conjunto:
I

es el menor numero
Succ: Dado i, cual
i en el

conjunto?
es el mayor numero
Pred: Dado i, cual
i en el conjunto?

Nuevamente, se responden facilmente


en tiempo
constante usando O(n log n) bits...

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank y Select

Con rank y select se pueden responder usando solo


n + o(n) bits:
I
I

Succ: select(B, rank (B, i 1) + 1).


Pred: select(B, rank (B, i)).

Podramos facilmente
obtener Succ k y Pred k en tiempo
constante.

Y con bitmaps comprimidos usaramos t log(n/t) bits!

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank
Rank en Tiempo Constante
I

Cortamos B en bloques de b = (log n)/2 bits.

Almacenamos un arreglo R[1, n/b] con los valores de rank


al comienzo de los bloques.

Como necesitamos log n bits para almacenar un valor de


rank, el total de bits que ocupa R es
n
n
log n =
log n = 2n
b
(log n)/2

de lo
Aceptemos ese precio en espacio por ahora (es mas
prometido).
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank

Como
calculamos rank(B, i) ?
I
I
I

Descomponemos i = q b + r , 0 r < b.
La cantidad de 1s hasta qb es R[q].
Debemos contar los 1s en B[qb + 1, qb + r ].

Supongamos que tenemos una tabla T [0, 2b 1][0, b 1],


tal que
T [x, r ] = total de 1s en x[1, r ]
donde vemos x como una tira de b bits.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank
I

Como cada celda de T puede tomar valores en [0, b 1],


T necesita
2b b log b = 2

log n
2

log n
(log log n 1)
2

1
n log n log log n = o(n) bits.
2

necesita 512 KB.


Por ejemplo, si n = 232 , T solo
Entonces, la respuesta final se obtiene en tiempo
constante como:
R[q] + T [B[qb + 1..qb + b], r ]

Muy bien, pero nos gastamos 3n + o(n) bits...


G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank
rank(B,13) = 7

0 0 1 1 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 1 1 1 0

000
001
010
011
100
101
110
111
G. Navarro

10

13

14

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank
Consiguiendo o(n) bits extra
I

en superbloques de
Cortamos B tambien
s =

(log n)2
= b log n bits.
2

Almacenamos un arreglo S[1, n/s] con los valores de rank


al comienzo de los superbloques.
desde
Ahora los valores de R se almacenan sumando solo
el comienzo del superbloque correspondiente:
R[q] = rank(B, qb) S[bq/ log nc]
= rank(B, qb) rank(B, bq/ log nc log n)
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank
I

Como necesitamos log n bits para almacenar un valor de


rank en S, el total de bits que ocupa S es
n
n
2n
log n =
log n =
= o(n)
2
s
log
n
(log n) /2

Como los valores de R se almacenan relativos al


pueden llegar a valer s = O(log n)2 , y
superbloque, solo
necesitan 2 log log n bits. Por ello R ocupa
por ello solo
ahora
n
n
2 log log n =
2 log log n
b
(log n)/2
4n log log n
=
= o(n) bits.
log n
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank

Como
calculamos rank(B, i) ?
I
I
I

Descomponemos i = q b + r , 0 r < b.
Descomponemos i = q 0 s + r 0 , 0 r 0 < s.
Y finalmente sumamos los contenidos de tres tablas:
rank (B, i) = S[q 0 ] + R[q] + T [B[qb + 1..qb + b], r ]

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank
rank(B,13) = 7

0 0 1 1 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 1 1 1 0

10

0 1 2 0 1 2 0 1 2 0 3 4

G. Navarro

000
001
010
011
100
101
110
111

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank
Practica

Implementacion
I

Evitar divisiones y modulos,


usar potencias de 2.

Tratar de usar valores alineados a bytes, shorts, o ints.


son parametrizables.
Los tamanos

I
I
I

Aprovechar el cache.
Ejemplo 1:
I
I
I

Usamos solamente superbloques, de 20 32 = 640 bits.


1
= 5%.
El espacio extra es 20
Recorremos secuencialmente el superbloque usando
popcount de a bytes (a lo sumo 80 operaciones).

Ejemplo 2:
I
I
I

32
Usamos superbloques de 256 bits (overhead 256
= 12.5%).
8
Usamos bloques de 32 bits (overhead 32 = 25%).
4 bytes.
Popcount de a lo mas
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank
Practica

Implementacion
1.1

Classical >66%
Two-level 37.5%
One-level 5%
One-level 10%
One-level 25%
One-level 33%
One-level 50%

time(microsec)

0.9
0.8
0.7
0.6

Observar el efecto del


cache y el hit ratio.

Graficos
obtenidos por mi

alumno Rodrigo Gonzalez.

0.5
0.4
0.3
0.2
0.1
0
12

14

16

18

20 22
log(n)

G. Navarro

24

26

28

30

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Select
Select en Tiempo Constante
I

donde o(n) = O(n/ log log n).


Describiremos una solucion

Notar que necesitamos hacer un sampling regular en los


argumentos de select, no regular en B (ambos criterios
coincidan para rank).

Un corte en bloques y superbloques como para rank no


funciona, porque los numeros
dentro de un bloque no se

reducen.

La idea fundamental es: si un bloque tiene pocos 1s,


puedo almacenar todas las respuestas a select en poco
espacio.
complejo que rank, tanto en la
Veremos que select es mas

teora como en la practica.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Select
I

Cortamos los argumentos de select en superbloques de


s = log2 n argumentos.

Estos superbloques tienen largo variable en B, pero tienen


exactamente s 1s.

Decimos que un superbloque es esparso si su largo en B


es a lo menos s log n log log n; sino es denso.
fundamental: podemos guardar todas las
Observacion
respuestas de todos los bloques esparsos y el sobrecosto
total es O(n/ log log n).

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Select
I

Almacenamos un bitmap E[1, n/s] indicando que


superbloques son esparsos.

Almacenamos todas las respuestas a select en todos los


superbloques esparsos en un arreglo de arreglos R:
select(B, i) = R[rank(E, bi/sc)] [1 + (i mod s)]
si E[bi/sc] = 1.

Para los superbloques densos, solamente almacenamos


un arreglo P[1, n/s] con las posiciones de B donde
comienzan.

Aun
no solucionamos el problema de los superbloques

densos, pero sabemos donde


empiezan, y su largo es a lo
s log n log log n = log3 n log log n.
mas
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Select
I

Dividimos los superbloques densos en bloques de


b = (log log n)2 argumentos.

Aplicamos la misma idea nuevamente dentro de cada


superbloque denso.

Necesitamos log(log3 n log log n) 4 log log n bits para


dentro de un superbloque denso.
almacenar una posicion

Diremos que un bloque es esparso si su largo en B es a lo


menos 4b(log log n)2 , y es denso sino.

Almacenar todas las respuestas (relativas) de los bloques


esparsos dentro de superbloques densos cuesta en total
O(n/ log log n) bits.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Select
I

Almacenaremos un bitmap E 0 [1, s/b] indicando que


bloques son esparsos.

Para los bloques densos, solamente


almacenamos un
0
arreglo P [1, s/b] con las posiciones del superbloque
donde comienzan.
O(n/ log log n) bits.
Este P 0 cuesta tambien

No hemos solucionado el problema de los bloques densos,

pero sabemos donde


empiezan, y su largo es a lo mas
4(log log n)4 = o(log n) (siempre es < 82 log n).

Entonces, los bloques densos se pueden procesar en


tiempo O(1) usando tablas tipo T .

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Select
I

Como
calculamos select(B, i)?
I
I
I
I
I

Descomponemos i = q s + r .
Si E[q] = 1, es un superbloque esparso y retornamos R[...].
Sino, es un superbloque denso que comienza en P[q].
Descomponemos r = q 0 b + r 0 .
Si Eq0 [q 0 ] = 1 es un bloque esparso, retornamos
P[q] + R 0 [...].
Sino, es un bloque denso que comienza en
p = P[q] + P 0 [q 0 ].

Buscamos el r 0 -esimo
1 en B[p...p + 4(log log n)4 ] usando
tablas.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Select
E

110 0

2 3 6 7

00110011101010000000110010011110

010

13

21 22

30

25

28

29

G. Navarro

000
001
010
011
100
101
110
111

0
3
2
2
1
1
1
1

0
0
0
3
0
3
2
2

0
0
0
0
0
0
0
3

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Select
Practica

Implementacion
I
I

Implementado directamente es bastante poco practico.


Por ejemplo:
I

I
I

Si aceptamos recorrer 2048 bits (512 bytes)


secuencialmente...
...logramos 78% de espacio extra.
queremos select0 .
Eso debe duplicarse si ademas

practica

Una solucion
aceptable:
I
I
I
I
I

select es el inverso de rank .


Lo resolvemos con busqueda
binaria en rank .

Primero en S, luego en R, finalmente en los bits.

El mismo espacio de rank , y resolvemos select0 tambien.


nivel de superbloques.
La mejor alternativa es con un solo

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Select
Practica

Implementacion
3

1/log(n)
5%
10%
25%
33%
50%

time(microsec)

2.5
2

Observar el efecto del


cache y el hit ratio.

1.5

Graficos
obtenidos por mi

alumno Rodrigo Gonzalez.

1
0.5
0
12

14

16

18

20 22
log(n)

G. Navarro

24

26

28

30

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Parte I: Secuencias
y Motivacion

Introduccion
La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos
Secuencias de Bits
Rank y Select, aplicaciones a Hashing, Sumas, Pred/Succ
Rank y Select sobre Secuencias Comprimidas

Secuencias Dinamicas,
aplicaciones a Sumas Parciales
Secuencias de Smbolos
Recurriendo a Secuencias de Bits
El Wavelet Tree, aplicaciones a Geometra y Relaciones
Revisitando las Secuencias de Bits
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank y Select sobre Secuencias Comprimidas


I

I
I

I
I

En muchas aplicaciones, la secuencia tiene pocos o


muchos 1s.
Nos concentraremos en el caso en que hay m << n 1s.
Por ejemplo, podramos responder select en tiempo
constante usando m log n bits (almacenar todas las
respuestas).
Hay una forma de generalizar esta idea simple?
Veremos que podemos conseguir rank y select en tiempo
constante utilizando
n
nH0 (B) + o(n) = m log + O(m) + o(n) bits.
m
es teorica

La solucion
pero veremos alternativas practicas.
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Comprimida
Representacion
I

Dividiremos la secuencia en bloques de b = (log n)/2 bits.

Sea ci la cantidad de 1s en un cierto bloque Bi .

La cantidad de bloques distintos de largo b con ci 1s es


 
b
ci
y por lo tanto trataremos de representar Bi usando

 
b
log
bits.
ci

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Comprimida
Representacion
I

de Bi sera (ci , oi ), donde


La representacion
I
I

La clase, ci , necesita dlog(b + 1)e bits.


El offset, oi , necesita dlog cbi e bits.

Los ci s son de largo fijo, y ocupan en total




n log log n
n
dlog(b + 1)e = O
b
log n

Los oi s son de largo variable. Los concatenaremos todos.


veremos como

Despues
decodificarlos.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Comprimida
Representacion
I

de los oi s ocupa
La concatenacion
 
 
n/b 
n/b
X
X
b
b
log

log
ci
ci
i=1

+ n/b

i=1

= log

n/b  
Y
b
i=1

ci

+ O(n/ log n)



(n/b) b
log Pn/b
+ O(n/ log n)
i=1 ci
 
n
= log
+ O(n/ log n)
m
nH0 (B) + O(n/ log n) bits.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Comprimida
Representacion
I
I

Hemos representado B usando nH0 (B) + o(n) bits!

Pero, como
podemos extraer algun
bloque Bi en tiempo
constante?

Primer problema: donde


esta oi ?
I
I
I
I
I

I
I

Podemos almacenar las posiciones en P[1, n/b]...


... pero eso requerira (n/b) log n = 2n bits extra.
Definimos superbloques de s = b log n bits...
para superbloques.
... y almacenamos P[1, n/s] solo
Ahora tendremos un P 0 [1, n/b] con punteros relativos al
superbloque (como en rank ).
Como |oi | = O(log n), cada P 0 [i] requiere O(log log n) bits.
Total: O(n log log n/ log n) bits.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Comprimida
Representacion
I

Segundo problema: que bloque representa (ci , oi )?


I

Tendremos una tabla W [0, 2b 1] donde se almacenen


todos los bitmaps de largo b agrupados por clase.
Las posiciones donde empieza cada clase en W se
en un arreglo
precalcularan
C[c] = 1 +

c1  
X
b
i=0

I
I

W esta ordenada de modo que oi es el ndice


correspondiente dentro de la zona de la clase ci .
Entonces, (ci , oi ) representa
W [C[ci ] + oi ].

Estas tablas ocupan O( n log n) bits.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Comprimida
Representacion

0 0 1 1 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 1 1 1 0

1 1 3 1 1 0 1 1 1 3 1

0 0 1 0 0 1 1 0 0 0 1 0 1 0 1 0

P
P

W
+10

15

0 2 4 0 2 4 0 2 4 0 0

G. Navarro

000
001
010
100
011
101
110
111

Estructuras de Datos Compactas

0
1 C
2
3

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank y Select
I

Las estructuras para rank y select ocupan o(n) bits


de B.
ademas

Necesitan acceso en tiempo constante a bloques de B.

Eso ya lo hemos conseguido con la representacion


comprimida!

Por lo tanto, hemos obtenido rank y select en tiempo


comprimida (a H0 ).
constante sobre la representacion
precisamente, usamos nH0 (B) + O(n log log n/ log n)
Mas
bits.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Comprimiendo a Orden k
I
I

de B que permita
Notar que cualquier representacion
obtener los bloques en tiempo constante sirve.
Consideremos el siguiente esquema:
I
I
I

Contamos cuantas
veces aparece cada bloque en B.
a menos frecuente.
Ordenamos los bloques de mas

Les asignamos codigos


de largo creciente:
, 0, 1, 00, 01, 10, 11, 000 . . .

Usamos los codigos


en vez de los pares (ci , oi ) del
esquema anterior.

Se puede probar que esto comprime a orden k:


nHk (B) + o(n),

G. Navarro

para todo k = o(log n)

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Comprimiendo a Orden k

Como
extraemos un bloque?
I

Almacenamos una tabla W con los bloques ordenados por


frecuencia.

Entonces al codigo
de valor numerico
i y de largo t le
corresponde el bloque numero

i +1+

t1
X

2j = i + 2t de la tabla.

j=0

Conseguimos rank y select en tiempo constante y espacio


nHk (B) + o(n) bits!

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Comprimiendo a Orden k

O
P
P

0 0 1 1 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 1 1 1 0

0 1 0 1 0 0 0 1

0 1 1 0 2 2 0 1 1 0 1

G. Navarro

(cod)

(frec)

100
001

""
0

5
2

111

000

00

010

01

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Comprimiendo a Orden k

Se puede generalizar a secuencias S[1, n] sobre un


.
alfabeto de tamano

Se obtiene acceso a O(log n) bits, es decir O(log n)


smbolos, en tiempo constante.

El espacio es
nHk (S) + o(n log ),

G. Navarro

para todo k = o(log n)

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank y Select
Practica

Implementacion
I

No funcionan tan bien como uno querra, especialmente si


la entropa es muy baja.

Las estructuras extra (ci , P 0 , R, etc.) pasan a dominar el


uso de espacio.

Veremos una alternativa practica


llamada sparse array,
para el caso de m << n.

Esencialmente, almacenamos todos los valores


S[i] = select(B, i), para 1 i m, y resolvemos rank con
busqueda
binaria.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank y Select
I

Los valores S[i] se separan en la parte baja li y la parte


alta hi .

La parte baja son los t bits menos significativos, de modo


que S[i] = hi 2t + li .


n
.
Elegimos t = log m

I
I

La secuencia L[i] de partes bajas se almacena en forma


n
+ O(m) bits.
normal, usando t m = m log m

La secuencia de partes altas se marcan en un bitmap


H[1, 2m], donde se prenden los bits H[hi + i].

Alcanzan 2m bits pues hm + m n/2t + m 2m.

n
El espacio total es m log m
+ O(m) = nH0 (B) + O(m).

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank y Select
I

resolver select en tiempo constante:


Es facil
select(B, i) = (select(H, i) i) 2t + L[i]

(hay que preprocesar H para consultas de select).


Para rank(B, i) se usa una busqueda
binaria mejorada.

I
I
I
I

El problema es encontrar donde


esta i en H.
t
Descomponemos i = h 2 + l, 0 l < 2t .
Cada 0 en H avanza 2t posiciones en B.
De modo que la respuesta esta entre los bloques
x = 1 + rank (H, select0 (H, h)) e
y = rank (H, select0 (H, h + 1)) de B.
Podemos hacer busqueda
binaria de l en L[x, y],

respondiendo rank en tiempo O(t) = O(log mn ).

En la practica
se prefiere la busqueda
secuencial.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank y Select

0 0 1 1 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 1 1 1 0

11

13

21

22

3 0 3 0 1 3 1 1 2 1 0 1 2 3

1 0 1 1 0 1 1 1 0 1 0 0 1 1 0 1 0 1 1 1 1

G. Navarro

25

28

29

Estructuras de Datos Compactas

30

31

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Rank y Select
Arreglos crecientes
I

con L y H es general?
Han notado que la solucion

Se puede aplicar a cualquier arreglo A[1, m] de valores


crecientes en [1, n].
n
permite representarlo usando m log m
+ O(m)
La solucion
bits...

... y acceder a las celdas en tiempo constante.

Incluso no es difcil modificar los valores de A.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Practica:

Implementacion
Espacio
Size of the data structures
6
vc
Kim
sa
Kim2
da
Navarro
rec
esp
entropy

Size (bpc)

Graficos
obtenidos por
Sadakane y su alumno
Okanohara

0
0

10

20

30

40
50
Ratio of 1

G. Navarro

60

70

80

90

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Practica:

Implementacion
Select
Time for 100,000,000 random select operations
120
esp
Kim
Kim2
rec
Navarro
vc
da
sa

100

Time (s)

80

60

Graficos
obtenidos por
Sadakane y su alumno
Okanohara

40

20

0
0

10

20

30

40

50
Ratio of 1

60

G. Navarro

70

80

90

100

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Practica:

Implementacion
Rank
Time for 100,000,000 random rank operations
120
vc
esp
Kim
rec
sa
da
Kim2
Navarro

100

Time (s)

80

60

Graficos
obtenidos por
Sadakane y su alumno
Okanohara

40

20

0
0

10

20

30

40

50
Ratio of 1

60

G. Navarro

70

80

90

100

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Parte I: Secuencias
y Motivacion

Introduccion
La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos
Secuencias de Bits
Rank y Select, aplicaciones a Hashing, Sumas, Pred/Succ
Rank y Select sobre Secuencias Comprimidas

Secuencias Dinamicas,
aplicaciones a Sumas Parciales
Secuencias de Smbolos
Recurriendo a Secuencias de Bits
El Wavelet Tree, aplicaciones a Geometra y Relaciones
Revisitando las Secuencias de Bits
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Secuencias Dinamicas
I

I
I
I

Hasta ahora hemos considerado secuencias de bits que


no cambian.
Que ocurre si queremos insertar y eliminar bits?
funcionan muy mal (recalcular todo).
Tal como estan,

En cambio, consideremos esta estructura de arbol


binario
balanceado:
I
I

Cada hoja maneja un bit.


Cada nodo interno conoce el total de bits y total de 1s en

su subarbol.

Todo se puede resolver en tiempo O(log n).

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Secuencias Dinamicas

Para encontrar el i-esimo


bit de B:
I

Si el subarbol
izquierdo contiene l i bits,

Sino,

busco el i-esimo
bit en el subarbol
izquierdo.

busco el (i l)-esimo
bit en el subarbol
derecho.

i, la busco e inserto o
Para insertar y borrar en la posicion
borro una hoja,
I
I

y recalculo cantidad de bits y de 1s,


y rebalanceo de ser necesario.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Secuencias Dinamicas
I

Para calcular rank(i)


I

Si el subarbol
izquierdo contiene l i bits,
I

calculo rank(i) en el subarbol


izquierdo.

Sino,

calculo rank(i l) en el subarbol


derecho y le sumo la

cantidad de 1s del subarbol


izquierdo.

Para calcular select(i)


I

Si el subarbol
izquierdo contiene s i 1s,

Sino,

calculo select(i) en el subarbol


izquierdo.

calculo select(i s) en el subarbol


derecho y le sumo la

cantidad de bits del subarbol


izquierdo.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Secuencias Dinamicas
I
I

Pero estamos ocupando O(n log n) bits!

Usaremos el truco estandar


para dinamizar estructuras
compactas:
I
I
I

Se construye la estructura dinamica


para bloques de datos.

Esos bloques se almacenan en forma estatica


y compacta.

Muchas veces se manejan brutalmente (reconstruccion


total, recorrido secuencial, etc.).
para no alterar los tiempos
Son suficientemente pequenos

de la estructura dinamica.
Son suficientemente grandes para que la estructura

dinamica
sea pequena.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Secuencias Dinamicas
I

Agrupamos s = log2 n bits en las hojas.

Formamos el arbol
sobre esas hojas.

Las operaciones en el arbol


cuestan tiempo O(log n)...

... y otro O(log n) en las hojas, usando tablas.

Como hay O(n/ log2 n) nodos, el arbol


ocupa O(n/ log n)
bits.
Se necesita cierto cuidado para no gastarse O(n) bits
extra en las hojas

No pueden estar llenas a medias, por ejemplo.

a una
Este esquema puede adaptarse tambien
comprimida de la secuencia.
representacion

Podemos permitir insertar, borrar, rank y select en tiempo


O(log n) y nH0 (B) + o(n) bits de espacio.
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Secuencias Dinamicas
rank(18)
16
33

rank(18)
18<=21

9
21

18>12
7+rank(1812)
7

12

12
6>3

3
6

4
6

4
6

3
6

7+1+rank(63)
1 0 0 1 0 1

1 1 1 0 0 1

0 0 1

1 0 0 0 0 0

0 1 0 1 1 1

0 1 0 1 0 1

9
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Secuencias Dinamicas
select(6)
16
33

select(6)
6<=9

9
21

6<=7
select(6)
7

12

12

6>3
3
6

4
6

4
6

3
6

6+select(63)
1 0 0 1 0 1

1 1 1 0 0 1

0 0 1

1 0 0 0 0 0

0 1 0 1 1 1

0 1 0 1 0 1

9
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Rank y Select
Secuencias Comprimidas

Secuencias Dinamicas

Sumas Parciales Dinamicas

Tenemos n numeros
de k bits.

de sum y search, permitiremos insertar y borrar


Ademas
numeros.

extender la tecnica

Es muy facil
de los bitmaps dinamicos.

En total necesitamos kn + o(kn) bits...

... y realizamos todas las operaciones en tiempo O(log n).

Con bitmaps comprimidos, se puede lograr espacio igual a


la suma total de bits necesarios para representar todos los
numeros.

I
I

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Parte I: Secuencias
y Motivacion

Introduccion
La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos
Secuencias de Bits
Rank y Select, aplicaciones a Hashing, Sumas, Pred/Succ
Rank y Select sobre Secuencias Comprimidas

Secuencias Dinamicas,
aplicaciones a Sumas Parciales
Secuencias de Smbolos
Recurriendo a Secuencias de Bits
El Wavelet Tree, aplicaciones a Geometra y Relaciones
Revisitando las Secuencias de Bits
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Secuencias de Smbolos

I
I

Consideremos ahora que manejamos una secuencia


.
S = s1 s2 . . . sn sobre un alfabeto de tamano
plana de S necesita n log bits.
Una representacion
Queremos hacer rank y select sobre esta secuencia:
I
I

rankc (S, i) = numero


de ocurrencias de c en S[1, i].

de la i-esima

selectc (S, i) = posicion


ocurrencia de c en S.

Como
podemos extender nuestros resultados sobre bits?

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Secuencias de Smbolos
I

Supongamos que almacenamos bitmaps Bc [1, n], c :


Bc [i] = 1 sii S[i] = c

Entonces
I
I

rankc (S, i) = rank1 (Bc , i).


selectc (S, i) = select1 (Bc , i).

Conseguimos tiempo constante... pero el precio es alto:


I
I
I

S ocupa n log bits.

Los bitmaps solos


ocupan n bits!
conocer S[i] sin almacenarlo cuesta tiempo O().
Ademas

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Secuencias Dinamicas
a l abar

la

a l aba rda

B_
Ba

00000010100100000000

Bb
Bd
Bl
Br

00010000000000010000

10101001001010101001
00000000000000000010
01000000010001000000
00000100000000000100
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Secuencias de Smbolos
I

Y si usaramos
bitmaps comprimidos?
I
I
I

Los nH0 (Bc ) suman nH0 (S).


Los espacios extras aun
suman mucho, o(n).

Si usaramos
la tecnica
practica
vista, el total sera
razonable: nH0 (S) + O(n).
El tiempo de rank sera cercano a O(log ), y el select
sera constante.
Pero aun
no podemos obtener S[i]!

tengamos S.
Estas ideas necesitan que ademas

Se puede hacer mejor?

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Parte I: Secuencias
y Motivacion

Introduccion
La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos
Secuencias de Bits
Rank y Select, aplicaciones a Hashing, Sumas, Pred/Succ
Rank y Select sobre Secuencias Comprimidas

Secuencias Dinamicas,
aplicaciones a Sumas Parciales
Secuencias de Smbolos
Recurriendo a Secuencias de Bits
El Wavelet Tree, aplicaciones a Geometra y Relaciones
Revisitando las Secuencias de Bits
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

El Wavelet Tree

elegante que permite almacenar S[1, n]:


Es una solucion
I
I
I

Usando n log + o(n log ) bits.


Resolviendo rank y select en tiempo O(log ).
Obteniendo S[i] en tiempo O(log ).

Se puede mejorar a espacio nH0 (S) + o(n log ).

Tiene muchas otras aplicaciones (veremos algunas).

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

El Wavelet Tree
I

I
I

Supongamos que partimos el alfabeto en dos


(o casi).
subconjuntos del mismo tamano
Creamos un bitmap indicando a que subconjunto pertence
cada letra de S.
Guardamos ese bitmap en la raz del wavelet tree.

Para el subarbol
izquierdo/derecho elegimos las letras de
S de cada subconjunto.

Continuamos recursivamente hasta que cada subconjunto


letra.
tenga una sola

ver que todos los bitmaps suman n log bits.


Es facil

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

El Wavelet Tree
a l abar a l a a l aba rda
01000100010001000110
_ab

dlr

aaba a a aabaa
00100000000100
_a

aaa a a aaaa
111010101111
_

l r l l rd
010010
dl

G. Navarro

r r

l l ld
1110

bb

aaaaaaaaa

l l l

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

El Wavelet Tree
I

Como
recuperamos una letra S[i]?
I
I

Miramos B[i] en la raz.


Si B[i] = 0,
I
I

Si B[i] = 1,
I
I

Nos vamos al subarbol


izquierdo.
es i 0 = rank0 (B, i).
La nueva posicion

Nos vamos al subarbol


derecho.
es i 0 = rank1 (B, i).
La nueva posicion

Cuando llegamos a una hoja, la letra correspondiente es


S[i].

Tiempo: log evaluaciones de rank.

Necesitamos preprocesar los bitmaps para rank.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

El Wavelet Tree
a l abar a l a a l aba rda
01000100010001000110
rank 0

_ab

dlr

aaba a a aabaa
00100000000100
_a

aaa a a aaaa
111010101111
_

l r l l rd
010010
dl

G. Navarro

r r

l l ld
1110

bb

aaaaaaaaa

l l l

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

El Wavelet Tree
I

Como
calculamos rankc (S, i)?
I
I

Sea B el bitmap de la raz.

Si c pertenece al subarbol
izquierdo,
I
I

Si c pertenece al subarbol
derecho,
I
I

Nos vamos al subarbol


izquierdo.
es i 0 = rank0 (B, i).
La nueva posicion

Nos vamos al subarbol


derecho.
es i 0 = rank1 (B, i).
La nueva posicion

Cuando llegamos a una hoja, la respuesta es i.

Tiempo: log evaluaciones de rank.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

El Wavelet Tree
rank l (S,11)

a l abar a l a a l aba rda


01000100010001000110
rank 1

_ab

dlr

aaba a a aabaa
00100000000100
_a

aaa a a aaaa
111010101111
_

l r l l rd
010010
dl

G. Navarro

r r

l l ld
1110

bb

aaaaaaaaa

l l l

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

El Wavelet Tree
I

Como
calculamos selectc (S, i)?
I
I
I

Nos vamos a la hoja correspondiente a c.


Sea B el bitmap de su padre.
Si la hoja es hijo izquierdo de su padre,
I
I

Si la hoja es hijo derecho de su padre,


I
I

Nos vamos al padre.


es i 0 = select0 (B, i).
La nueva posicion
Nos vamos al padre.
es i 0 = select1 (B, i).
La nueva posicion

Cuando llegamos a la raz, la respuesta es i.

Tiempo: log evaluaciones de select.

Necesitamos preprocesar los bitmaps para select.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

El Wavelet Tree
select b(S,2)

a l abar a l a a l aba rda


01000100010001000110
_ab

dlr

aaba a a aabaa
00100000000100
select 1

_a

aaa a a aaaa
111010101111
_

l r l l rd
010010
dl

G. Navarro

r r

l l ld
1110

bb

aaaaaaaaa

l l l

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Extensiones
I
I
I
I
I
I
I

Si representamos los bitmaps como secuencias


comprimidas, obtenemos nH0 (S) + o(n log ) bits.

Si utilizamos bitmaps dinamicos,


podemos insertar y
eliminar letras en tiempo O(log n log ).
cuestan
En ese caso las otras operaciones tambien
O(log n log ).
Podramos mejorar los tiempos con wavelet trees
multiarios.
Para ello necesitaramos manejar secuencias de smbolos
en cada nivel del wavelet tree, en tiempo constante.

Esto se puede hacer con la tecnica


de los pares (c, o),

para alfabetos pequenos,


o(log n/ log log n).
En total, todos los tiempos O(log ) se pueden mejorar a
O(1 + logloglog n ).
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Huffman Wavelet Trees


I

I
I
I
I

I
I

Veremos una alternativa practica


para obtener casi
nH0 (S) + o(n log ) bits.
En vez de utilizar bitmaps comprimidos, usaremos los
explcitos.

Pero le daremos forma de arbol


de Huffman al wavelet
tree.
No es difcil ver que el largo total de las tiras de bits...
... es exactamente el largo de S comprimida con Huffman.
Este largo es < n(H0 (S) + 1).
si los caracteres se acceden con la misma
Ademas,
frecuencia que tienen en S...
el tiempo promedio de acceso baja a O(H0 (S)).
Se puede limitar la altura a O(log ) para el peor caso.
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Huffman Wavelet Trees


a l abar a l a a l aba rda
01010110110101010110
a

_bdlr

aaaaaaaaa

lb r
l l br d
110001011 00
bl

_dr

lb l lb
10110
b

r
r d
100011
l

bb

dr

l l l

r rd
110
d

d
G. Navarro

Estructuras de Datos Compactas

r r

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Un Problema Geometrico
I

Tenemos una grilla discreta de [1, n] [1, n] (para

simplificar, pero podra ser rectangular tambien).


de un punto
Almacenamos t puntos en esa grilla (no mas
por celda, para simplificar).
Queremos responder consultas de rangos:
I
I

Cuantos
puntos hay en [x1 , x2 ] [y1 , y2 ]?
Que puntos hay en [x1 , x2 ] [y1 , y2 ]?

Un wavelet tree puede resolver este problema:


I
I
I

Usando (n + t log n)(1 + o(1)) bits de espacio.


Calculando la cantidad de puntos en tiempo O(log n).
Reportando cada punto en tiempo O(log n).

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Un Problema Geometrico
I

I
I
I

I
I

Comencemos con un caso simplificado: Hay exactamente


un punto por valor en coordenada x.
Entonces las coordenadas y de los puntos, ordenados por
coordenada x, forman una secuencia S[1, n].
Construimos el wavelet tree sobre S.
Los segmentos en S corresponden a rangos en el eje x.
Las particiones en mitades que hace el wavelet tree
corresponden al eje y.
Dado un punto p = (x, y), vale que S[x] = y .

Si seguimos a p por el arbol,


usando rank, llegamos a la

y-esima
hoja.
Si seguimos un valor y desde una hoja, usando select,
x correspondiente en la raz.
llegamos a la posicion
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Un Problema Geometrico
21 7 12 9 20 11 8 3 15 1 13 5 17 4 16 19 10 2 14 6 18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Un Problema Geometrico
21 7 12 9 20 11 8 3 15 1 13 5 17 4 16 19 10 2 14 6 18
1
2
3
4
5
6
7
8
9
10
11
7

11 8 3

10 2

12
13
14
15
16
17
18
19
20
21
21

12

20

15
G. Navarro

13

17

16 19

14

18

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Un Problema Geometrico
21 7 12 9 20 11 8 3 15 1 13 5 17 4 16 19 10 2 14 6 18
1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 1 0 0 1 0 1

7 9 11 8 3 1 5 4 10 2 6
1
2
3
4
5
6
7
8
9
10
11

21 12 20 15 13 17 16 19 14 18
12
13
14
15
16
17
18
19
20
21

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Un Problema Geometrico
21 7 12 9 20 11 8 3 15 1 13 5 17 4 16 19 10 2 14 6 18
1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 1 0 0 1 0 1

7 9 11 8 3 1 5 4 10 2 6
1 1 1 1 0 0 0 0 1 0 0

3 1 5 4 2 6
0 0 1 1 0 1

3 1 2
1 0 0

1 2
0 1
1

7 9 11 8 10
0 0 1 0 1

5 4 6
1 1 0

5 4
1 0
4

21 12 20 15 13 17 16 19 14 18
1 0 1 0 0 1 0 1 0 1

12 15 13 16 14
0 1 0 1 0

21 20 17 19 18
1 1 0 0 0

7 9 8
0 1 0

11 10
1 0

12 13 14
0 0 1

7 8
0 1

10 11

12 13 14 15 16 17 18 19 20 21
0 1
0 1

12
G. Navarro

13

15 16
0 1

17 19 18
0 1 0

17

21 20
1 0

18

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Un Problema Geometrico

en general, necesitaremos proyectar un rango de


Mas
valores x:
I
I
I

Si en un nodo v , correspondiente al rango [y, y 0 ],


tenemos un rango B[x, x 0 ] en el bitmap de v ,
entonces [1 + rank0 (B, x 1), rank0 (B, x 0 )] es el rango de
los puntos esos que caen en la primera mitad de [y, y 0 ],
y [1 + rank1 (B, x 1), rank1 (B, x 0 )] es el rango de los
puntos esos que caen en la segunda mitad de [y, y 0 ].

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Un Problema Geometrico
I

Para contar cuantos


puntos hay en [x1 , x2 ] [y1 , y2 ]:
I
I
I

Partimos en la raz con el rango [x, x 0 ] = [x1 , x2 ].

Proyectamos el rango en ambos subarboles.

Continuamos recursivamente, deteniendonos


cuando:
I

I
I

El intervalo [x, x 0 ] esta vaco (no hay puntos del rango


original [x1 , x2 ] que caen en el rango [y , y 0 ] de este nodo).
El intervalo [y , y 0 ] es disjunto con el original ([y1 , y2 ]).
El intervalo [y , y 0 ] esta contenido en el original ([y1 , y2 ]):
Sumar x 0 x + 1 al total

Todo subintervalo de [y1 , y2 ] se cubre con O(log n) nodos


[y , y 0 ] del wavelet tree.
El algoritmo hace O(log n) operaciones.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Un Problema Geometrico

Para encontrar esos puntos.


I
I

Partir de cada nodo en el que contamos resultados.


Seguir cada punto de [x, x 0 ] hacia abajo hasta descubrir su
coordenada y.
Y/o seguir cada punto de [x, x 0 ] hacia arriba hasta
descubrir su coordenada x.

Esto claramente cuesta O(log n) por cada punto.

Debemos concatenar los bitmaps de cada nivel para no

tener demasiados punteros en el arbol.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Un Problema Geometrico
I
I

de un punto por coordenada.


Eliminemos la simplificacion
por cada punto
El wavelet tree ahora maneja una posicion
almacenado (t puntos).

En la raz los puntos se ordenan columna a columna (y por


fila dentro de cada columna).

Un bitmap X [1, n + t] tiene un 1 por cada cambio de


columna y un 0 por cada nuevo punto.

El arbol
va subdividiendo los puntos segun
coordenada y .

I
I

En las hojas los puntos se encuentran ledos fila a fila (y


por columna dentro de cada fila).

No necesito un equivalente a Y para leer por filas, pues se


en que hoja del wavelet tree estoy.
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Permutaciones
I

se
La variante simplificada de puntos en n n tambien

puede ver como una permutacion.


se puede almacenar en n log n bits y,
Una permutacion
dado i, calcular (i) en tiempo constante.
la permutacion
inversa 1 (i),
Si quisiera tambien
necesitara otros n log n bits.
Con un wavelet tree sobre S represento implcitamente
ambas permutaciones con n log n + o(n log n) bits y
calculo:


log n
log log n

(i) = S[i] en tiempo O

1 (i) = selecti (S, 1) en tiempo O

G. Navarro

log n
log log n

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Permutaciones
I
I

Se puede hacer mejor? S.


es una secuencia
Un ciclo de una permutacion
i, (i), ((i)), (((i))), . . . , 1 (i), i

I
I

de [1, n] se descompone en ciclos.


Toda permutacion
1
Para calcular (i), basta seguir el ciclo desde i hasta
que volvamos a i
I

I
I

El ultimo
valor visitado antes de volver a i es 1 (i).

Pero el ciclo puede ser muy largo!


Cada t valores de un ciclo largo, introduciremos punteros
reversos que retrocedan t valores en el ciclo.
Si parto de i, puedo tomar el primer puntero reverso que
t + 1 pasos.
encuentre, y llegare a i de vuelta en a lo mas
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Permutaciones

21 7 12 9 20 11 8
19

10

11

12

13

14

15

16

17

18

19

20

21

3 15 1 13 5 17 4 16 19 10 2 14 6 18
4
15

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Permutaciones
I

Como
almaceno eficientemente los punteros reversos?
I

Marco en un bitmap R[1, n] que posiciones tienen punteros


reversos.
Almaceno sus valores en forma compacta en P[1, s],
s n/t.
Si R[i] = 1, hay un puntero reverso en i, y su valor esta en
P[rank (R, i)].

En total ocupo n log n + (n/t) log n + n + o(n) bits.

Resuelvo (i) en O(1) y 1 (i) en O(t).


Por ejemplo:

Con (1 + )n log n + O(n) bits, para  constante, resuelvo


en tiempo O(1) y 1 en tiempo O(1/) = O(1).
Con n log n + O(n log log n) bits, resuelvo en tiempo O(1)
y 1 en tiempo O(log n/ log log n) (mejor que con wavelet
trees).
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Permutaciones

Y si quisiera resolver k y k ?
I
I
I

I
I

Imaginemos que escribimos los ciclos explcitamente en S.


(i) sigue a i en S; 1 precede a i.

Marcamos en un bitmap C[1, n] donde


comienzan los
ciclos.
0 que me lleva de la
Almacenamos una permutacion
donde se mapeo en S.
secuencia original a la posicion

Represento 0 con la tecnica


anterior.
Eso basta para calcular cualquier k y k en tiempo O(t).

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Permutaciones
I

Para calcular k (i) (k positivo o negativo):


I
I

Con i 0 = 0 (i) ubico i en S.


Calculo los lmites del ciclo:
I
I

l = select(C, rank (C, l))


r = select(C, rank(C, l) + 1)

que corresponde a k (i) es


La posicion
j 0 = l + (i 0 + k l mod (r l))

Finalmente vuelvo: k (i) = 01 (j 0 )

Se puede extender a mapeos (no lo veremos).

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Permutaciones

21 7 12 9 20 11 8

21 18 2

10

11

12

13

14

15

16

17

18

19

20

21

3 15 1 13 5 17 4 16 19 10 2 14 6 18

3 12 5 20 6 11 13 17 10 1

9 15 16 19 14 4

10

11

G. Navarro

12

13

14

15

16

17

18

19

Estructuras de Datos Compactas

20

21

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Parte I: Secuencias
y Motivacion

Introduccion
La Jerarqua de Memoria
Estructuras de Datos Compactas

Conceptos Basicos
Secuencias de Bits
Rank y Select, aplicaciones a Hashing, Sumas, Pred/Succ
Rank y Select sobre Secuencias Comprimidas

Secuencias Dinamicas,
aplicaciones a Sumas Parciales
Secuencias de Smbolos
Recurriendo a Secuencias de Bits
El Wavelet Tree, aplicaciones a Geometra y Relaciones
Revisitando las Secuencias de Bits
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Revisitando las Secuencias de Bits

de secuencias de bits, que


Volvamos a la solucion
promete mejores tiempos.

Conseguiremos tiempos de la forma O(log log ) ...

... y espacio n log + n o(log ).

Cortaremos las secuencias de bits en bloques de largo .


Resolveremos separadamente dos subproblemas:

I
I

Determinar la respuesta a nivel de bloque.


Refinar la respuesta dentro del bloque.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Revisitando las Secuencias de Bits

Nivel de bloques
I
I

Consideremos una secuencia de bits particular Bc .


La representaremos con otra secuencia de bits Lc , donde
I
I
I

Comenzare poniendo un 0.
Ire agregando los 1s que aparecen en Bc .
Ire agregando un 0 cuando cambie de bloque.

Sumando sobre todas las Lc , tengo n 1s y n 0s.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Revisitando las Secuencias de Bits


a l abar

la

a l aba rda

B_
Ba
Bb
Bd
Bl
Br

00000010100100000000

L_
La

00111000

Lb
Ld
Ll
Lr

0100100

10101001001010101001
00010000000000010000
00000000000000000010
01000000010001000000
00000100000000000100
01110110111010
000010
0101010
0100100

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Revisitando las Secuencias de Bits


I

Para calcular rankc (S, i) = rank(Bc , i):


I
I
I
I
I

Calculo b = 1 + bi/c.
Calculo r = rank1 (Lc , select0 (Lc , b)).
b es el bloque donde debo completar la respuesta.
r es la cantidad de ocurrencias de c antes del bloque b.
Dentro del bloque b debo calcular rankc (1 + (i mod )).

Para calcular S[i]:


I
I
I

Calculo b = 1 + bi/c.
b es el bloque donde debo buscar la respuesta.

Dentro del bloque b debo obtener el smbolo en la posicion


1 + (i mod ).

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Revisitando las Secuencias de Bits

Para calcular select(S, i) = select(Bc , i):


I
I
I
I

Calculo j = select1 (Lc , i).


Calculo b = rank0 (Lc , j).
b es el bloque donde debo completar la respuesta.
Dentro del bloque b debo calcular
selectc (j select0 (Lc , b)).
debo sumarle b .
A esa posicion

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Revisitando las Secuencias de Bits


Resolviendo dentro de un bloque
I

Almacenamos las posiciones donde ocurre "a" en orden,


luego donde ocurre "b" en orden, etc.
de [1, ].
El resultado es una permutacion

almaceno un bitmap P[1, 2] con un 1 por cada


Ademas
ocurrencia almacenada en de cada smbolo, insertando
un 0 al principio y cada vez que se cambia de smbolo.

Entonces selectc (i) = (select0 (P, c) c + i 1).

Asimismo, S[i] = rank0 (P, select1 (P, 1 (i))).

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Revisitando las Secuencias de Bits


a l abar

B_
Ba
Bb
Bd
Bl
Br

la

a l aba rda

00000010100100000000
10101001001010101001
00010000000000010000
00000000000000000010
01000000010001000000
00000100000000000100

135426
P 0011101001010
G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Revisitando las Secuencias de Bits


I

difcil es rankc (S, i):


Lo mas
I

I
I

La zona de las ocurrencias de c en es


[l, r ] = [select0 (P, c) c + 1 . . . select0 (P, c + 1) (c + 1)].
Si hago busqueda
binaria consigo tiempo O(log ).

Para conseguir O(log log ):


I
I
I

I
I

Anoto los valores [i log ] en una lista.


en [1, ].
Esta lista tiene log numeros

La separo en las sublistas (crecientes) que corresponden a


cada c.
Necesito calcular el predecesor y sucesor de i en una de
esas sublistas.
Lo hago en tiempo constante con bitmaps comprimidos.
Completo la busqueda
binaria en el tramo de log valores.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Revisitando las Secuencias de Bits


I

Los bitmaps Lc ocupan 2n + o(n) bits.

Las permutaciones ocupan n log bits.

Para obtener 1 en tiempo O(log log ) necesitamos


punteros reversos que ocupen O(n logloglog ) = n o(log ).

Los bitmaps P ocupan 2n + o(n) bits (son los Lc


reordenados).

Los bitmaps para predecesor y sucesor ocupan


log log

O( n log log / log


) = O(n log ) bits.

Total n log + O(n

S[i] y rankc se calculan en tiempo O(log log ).

selectc se calcula en tiempo constante.

log
log log )

G. Navarro

bits.

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Relaciones Binarias

se puede extender a relaciones binarias R


La solucion
entre dos conjuntos A y B.

Si |A| = n y |B| = m, el punto (i, j) existe sii ai R bj .


Queremos resolver las siguientes operaciones
eficientemente:

I
I
I

Dados ai y bj , determinar si ai R bj .
Dado ai , contar/listar los bj tal que ai R bj .
Dado bj , contar/listar los ai tal que ai R bj .

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Relaciones Binarias
I

binaria como t 1s
Si |R| = t, podemos ver la relacion
distribuidos en n bitmaps de largo m.

Imaginemos que leemos esos 1s columna a columna, y


escribimos las filas donde aparecen en una secuencia S.
agregamos a un bitmap L un 1 por cada fila
Ademas
uno final).
anotada y un 0 por cada nueva columna (mas

Preprocesamos S y L para rank y select.

El espacio total es t log n + t + m bits.

O t log m + t + n, lo que sea menor.

Las operaciones cuestan O(log log t) por respuesta.

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Relaciones Binarias

1 2 3 4 5 6 7 8 9 10

a
b
c
d
e
f

0000101000

bd

c ab e f

f ab

ce

1000101000
0001000001

0 11 0 0 0 1 0 1111 0 1 0 11 0 0 0 1 1 0

1000000000
0000100001
0000110000

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Relaciones Binarias
I

Determinar si un par (ai , bj ) esta relacionado:


ranki (S, select0 (L, j + 1) (j + 1)) ranki (S, select0 (L, j) j)

Contar con cuantos


pares esta relacionado bj :
select0 (L, j + 1) select0 (L, j) 1

Contar con cuantos


pares esta relacionado ai :
ranki (S, t)

Listar con quienes


se relaciona bj
S[k + (select0 (L, j) j)],

k = 1, 2, . . .

Listar con quienes


se relaciona ai
rank0 (L, select1 (L, selectk (S, i)))],
G. Navarro

k = 1, 2, . . .

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Relaciones Binarias

sofisticadas...
Con tecnicas
un poco mas
I
I

Ocupamos t log mn
t bits (orden cero).
Resolvemos todas las consultas en tiempo O(log log mn
t ).

se
Se particiona horizontalmente y luego cada particion
re-particiona verticalmente.

Eso garantiza una cantidad conveniente de 1s en cada


bloque.
detalles.
No veremos mas

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Relaciones Binarias

inmediata 1: Grafos G = (V , E)
Aplicacion
I
I

I
I
I
I

A = B = V son los nodos, E = R son las aristas.

El espacio es basicamente
e log n, como una lista de
adyacencia.
Permite saber si una arista esta presente en el grafo.
Permite listar los vecinos directos y reversos.
Permite contarlos eficientemente.
Cada respuesta en tiempo O(log log n).

G. Navarro

Estructuras de Datos Compactas

y Motivacion

Introduccion
Secuencias de Bits
Secuencias de Smbolos

Recurriendo a Secuencias de Bits


El Wavelet Tree
Revisitando las Secuencias de Bits

Relaciones Binarias
I

inmediata 2: Indices Invertidos


Aplicacion
I

I
I
I

I
I

y B las p
A son los d documentos de una coleccion
palabras distintas (vocabulario).

El espacio es basicamente
t log p bits, menos que una
plana de la coleccion.

representacion
O bien t log d bits, igual que un ndice invertido tradicional.
Podemos saber si una palabra aparece en un documento.
Podemos listar los documentos donde aparece una
palabra, y las palabras que aparecen en un documento.

Podemos saber en cuantos


documentos distintos aparece
una palabra (llamado df y muy importante para calcular
relevancia).
cuantas

Y tambien
palabras distintas tiene un documento.
El tiempo es O(log log p) o O(log log d).

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Parte II: Otras Estructuras


Arboles
con Parentesis

Representacion

a Mnimos en Rangos
Navegando en Parentesis,
aplicacion
de Arboles
Otra Representacion
Textos
El Arreglo de Sufijos Comprimido
de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Arboles Generales
I

I
I

I
I

Una estructura clasica


de punteros ocupa O(n log n) bits

para un arbol
de n nodos.

Permite navegar en el arbol


en tiempo constante.

22n / n arboles
distintos con n
Pero realmente hay solo
nodos.
Se debera poder almacenar con 2n o(n) bits.

En realidad no es difcil representar un arbol


en ese
espacio...

... el verdadero desafo es poderlo navegar sin


descompactarlo.

Veremos la forma de lograrlo en tiempo constante por


usando 2n + o(n) bits.
operacion,
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

con Parentesis

Representacion
I

I
I

muy conocida de arboles

Una representacion
generales

utiliza parentesis
balanceados.

Recorremos el arbol
en preorden.
Es decir, al llegar a un nodo:
I
I
I

Escribimos un (.
Recorremos sus hijos en orden.
Escribimos un ).

R(v ) de
O, expresado de otra manera, la representacion
un nodo v con hijos v1 , v2 . . . vk es
R(v )

( R(v1 ) R(v2 ) . . . R(vk ) )

El resultado es una secuencia balanceada de 2n

parentesis.
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

con Parentesis

Representacion

( 1)
(2)

( 10 )

(3 )( 4) ( 5 )( 9)

( 11 )
( 12 )

( 13 )

(6)

( 14 )

(7) (8)

( 15 )
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

con Parentesis

Representacion
I

Una secuencia balanceada de parentesis


cumple:
I
I
I

Es una secuencia sobre los smbolos ( y ).


En total hay tantos ( como ).
En cualquier punto i de la secuencia, la cantidad de ( en
S[1, i] es a la cantidad de ) en S[1, i].

Esto ultimo
tiene nombre: se llama exceso en i:

exceso(S, i) = rank( (S, i) rank) (S, i)


y la propiedad establece simplemente que
exceso(S, i) 0 para todo i, y que exceso(S, 2n) = 0.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

con Parentesis

Representacion
I

Llamaremos pareja de un ( al ) que lo cierra, y


pareja de un ) al ( que lo abre.
de su
Si S[v ] =0 (0 , llamaremos close(v ) a la posicion
pareja.
de su
Si S[v ] =0 )0 , llamaremos open(v ) a la posicion
pareja.
Observar:
I

close(v ) es el menor v 0 > v tal que


exceso(v 0 ) = exceso(v ) 1.
open(v 0 ) es el mayor v < v 0 tal que
exceso(v ) = exceso(v 0 ) + 1.

G. Navarro

Estructuras de Datos Compactas

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Arboles
Textos
Grafos

con Parentesis

Representacion
1

11

10

12

6
7

13

14
8

15

((( )( )(( ( )( )))( ))( )(( )((( )))))


parejas (open/close)
exceso = 3
preorden = 13
rank() = 7

G. Navarro

exceso = 2
preorden = 15
rank() = 8

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

con Parentesis

Representacion
Varias propiedades interesantes
I

Identificaremos a un nodo v con su ( correspondiente.

Una hoja se ve as: ().

u es ancestro de v , sii [u, close(u)] contiene estrictamente


a [v , close(v )].

La profundidad de v en el arbol
es exceso(v ).
de v en una enumeracion
en preorden del
La posicion

arbol
es rank( (S, v ).

I
I

asociada a los
Esto es util
para almacenar informacion
nodos.
Se puede igualmente precalcular un rank() (S, v ) para
asociada a las hojas.
almacenar informacion

tamano
de subarbol.

Con eso tenemos tambien


G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

con Parentesis

Representacion

Navegacion
I

El siguiente hermano de v es close(v ) + 1


I

El hermano previo de v es open(v 1)


I

Pero si S[v 1] = (, v no tiene hermano previo.

El primer hijo de v es v + 1
I

Pero si es un ), v no tiene siguiente hermano.

Pero si es un ), v no tiene hijos.

de calcular.
El padre de v no es tan facil
I
I

enclose(v ).
Se crea la operacion
profundo que contiene a v .
Es el ( del nodo mas

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

con Parentesis

Representacion
I

I
I

Por lo tanto, basta con implementar open, close y


enclose...
en un
... para tener bastantes operaciones de navegacion

arbol
representado con parentesis.
Conseguiremos tiempo constante usando 2n + o(n) bits.
Hay muchas otras operaciones interesantes:
I
I
I

bajo,
i-esimo
padre, ancestro comun
mas

i-esimo
hijo, hijo con rotulo
l,
busqueda
de caminos rotulados, ...

pueden hacerse eficientemente, con tecnicas

Tambien

mas avanzadas.

Asimismo puede comprimirse el arbol.

algunas de estas cosas.


Veremos solo

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Parte II: Otras Estructuras


Arboles
con Parentesis

Representacion

a Mnimos en Rangos
Navegando en Parentesis,
aplicacion
de Arboles
Otra Representacion
Textos
El Arreglo de Sufijos Comprimido
de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Navegando entre Parentesis


close
Operacion
I

Dividimos la secuencia de parentesis


en bloques de largo
b = log2 n .

Un parentesis
es cercano si su pareja esta en el mismo
bloque, sino es lejano.

Resolver close(v ) para un v cercano es facil:


I
I
I
I
I

Tenemos una tabla T [x, v ], 0 x < 2b , 1 v b.


en el.

x es el bitmap de un bloque y v una posicion

T [x, v ] precalcula close(v ) si este


esta dentro de x.
Sino, indicaque v es lejano.
T requiere n log n log log n = o(n) bits.

Nuestro verdadero problema son los parentesis


lejanos.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Navegando entre Parentesis

Parentesis
lejanos y pioneros
I
I

Distinguiremos algunos parentesis


lejanos como pioneros.

Un parentesis
lejano p (que abre) es pionero si el previo
lejano que abre se cierra en un bloque distinto al del que
cierra p.

Un parentesis
lejano p (que cierra) es pionero si el
siguiente lejano que cierra se abre en un bloque distinto al
del que abre p.
es pionero.
La pareja de un pionero tambien

G. Navarro

Estructuras de Datos Compactas

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Arboles
Textos
Grafos

Navegando entre Parentesis


1

6
7

11

10

12

cercanos
lejanos
pioneros (

13

14

15

((( )( )(( ( )( )))( ))( )(( )((( )))))


G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Navegando entre Parentesis


Dos propiedades esenciales sobre pioneros
I

Hay a lo sumo 4n/b parentesis


pioneros.
I

Pues cada pionero (por derecho propio) que abre debe


cerrarse en un bloque distinto.
Con los que cierran, y con las parejas de los pioneros,
podemos cuadruplicar la cantidad.

El parentesis
que cierra a v esta en el mismo bloque que
el que cierra al ultimo
pionero que abre en S[1, v ].

Si ese pionero no es v mismo, se cierra en el mismo


(y se cierra despues
de v ).
bloque que v , por definicion
El ultimo
pionero en S[1, v ] debe abrir, pues si cerrara, el

sera pionero.
primero lejano que abre luego de el
Por lo tanto el ultimo
pionero representa un ancestro de v .

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Navegando entre Parentesis


Estrategia general para hallar v 0 = close(v )
I

Buscaremos el ultimo
pionero p que abre en S[1, v ].

Resolveremos p0 = close(p) de alguna manera.

Buscaremos v 0 con tablas en el bloque de p0 .

Resolviendo close para pioneros


I

La secuencia de parentesis
pioneros es una nueva
secuencia balanceada.

Supongamos por un momento que en esa secuencia


puedo responder en tiempo constante open0 , close0 , y
enclose0 .

Luego lo resolveremos usando recursion.

G. Navarro

Estructuras de Datos Compactas

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Arboles
Textos
Grafos

Navegando entre Parentesis


Hallando el ultimo
pionero

Marco en una secuencia P con un 1 los parentesis


que
son pioneros.

Representada en forma comprimida, P requiere


O(n

log b
b )

= O(n

log log n
log n )

= o(n) bits.

Encontramos el parentesis
pionero que precede a v
mediante p = select(P, rank(P, v )).
en la secuencia reducida es q = rank(P, p).
Su posicion

Entonces p0 = select(P, close0 (q)).

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Navegando entre Parentesis

Hallando close en el bloque donde cierra el pionero


I

Tenemos ubicado a p0 , en el mismo bloque de v 0 .

Sabemos que
exceso(v 0 ) exceso(p0 ) = exceso(v ) exceso(p).

Con eso, podemos encontrar v 0 a partir de p0 usando una


tabla parecida a T .

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Navegando entre Parentesis

Recursion
I

En la secuencia de pioneros (de largo 4n/b) hacemos


exactamente lo mismo, en forma recursiva (mantenemos
el mismo b).

Al siguiente nivel, ya hay O(n/ log2 n) parentesis,


y todas
las respuestas se pueden almacenar directamente con
O(n/ log n) bits.
2 niveles de recursion,
tiempo total constante.
Son solo

Resolviendo open(v )
I

Es completamente simetrico
a close(v ).

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Navegando entre Parentesis


Resolviendo enclose(v )
I

Es el ultimo
u < v tal que exceso(u) = exceso(v ) 1.

Primero se ve con tablas si esta en el mismo bloque de v o


de close(v ).

Calculamos el primer pionero c 0 en S[v . . .].

Si c 0 cierra, entonces calculamos p0 = open(c 0 ), sino


p0 = enclose(c 0 ) en la secuencia de pioneros.
cercano que encierra a v .
p0 es el pionero mas

I
I

Entonces u = enclose(v ) debe estar en el mismo bloque


de p0 (o puede ser el mismo p0 ).
que p0 , despues

Se busca con tablas u = ultimo


parentesis
que abre en el

bloque de p0 con el exceso correcto.


G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Navegando entre Parentesis


Espacio total
I

La secuencia de parentesis
S usa 2n bits.

La secuencia P que marca pioneros, comprimida, usa


O(n logloglogn n ) bits.

Las tablas (universales) usan O( n polylog(n)) bits.

El segundo nivel requiere O(n/ log n) bits.

El tercer nivel requiere O(n/ log n) bits.

Total:


log log n
2n + O n
log n

G. Navarro


= 2n + o(n) bits.

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Arboles Binarios
I

Se pueden representar como arboles


generales, pero
requieren 4n bits (marcar hojas explcitamente).

Pero se puede representar con 2n bits.

La idea es usar un mapeo conocido entre arboles


binarios
y generales.

El arbol
general tiene una raz ficticia (que no pondremos

en los parentesis)...

derecho del arbol

... y todo el camino mas


binario son los

hijos de la raz del arbol


general.

Luego se transforma recursivamente.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Arboles Binarios

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Arboles Binarios

((( (( ))) ( )) ()( ))


G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Arboles Binarios

Navegacion
I

La raz del arbol


binario es el primer hijo del arbol
general.

Hijo izquierdo de v : primer hijo de v (= v + 1).

Hijo derecho de v : siguiente hermano de v .

Padre de hijo izquierdo v : padre de v (= v 1).

Padre de hijo derecho v : hermano previo de v .

v es hijo izquierdo sii S[v 1] =0 (0 .

v es hoja sii S[v + 1] =0 )0 y S[v + 2] =0 )0 .

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Arboles Binarios

((( (( ))) ( )) ()( ))


G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Bajo
LCA: Ancestro Comun
mas
I

profundo que es ancestro de v


LCA(v , v 0 ) es el nodo mas
y de v 0 .

Tiene muchas aplicaciones importantes (veremos una).

Se puede calcular en tiempo constante.

Si v es ancestro de v 0 , entonces LCA(v , v 0 ) = v , y

simetricamente
con v 0 .

Dediquemonos
al caso en que eso no ocurre:

Propiedad: v y v 0 descienden de hijos distintos de


LCA(v , v 0 ).
Propiedad: LCA(v , v 0 ) es el padre del nodo con menor
exceso en [x, y] = [min(v , v 0 ), max(v , v 0 )].
I

pues el 0 (0 del hijo del LCA que es ancestro de max(v , v 0 )


debe estar en el rango, mientras que el del LCA no.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Bajo
LCA: Ancestro Comun
mas

Dividiremos la secuencia de parentesis


en bloques y
superbloques.
Los bloques miden b = log2 n bits y los superbloques
s = 2b log2 n = log3 n bits.
La idea general es encontrar separadamente los menores
excesos en los superbloques, bloques, y posiciones
individuales involucrados en el rango [x, y ].

G. Navarro

Estructuras de Datos Compactas

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Arboles
Textos
Grafos

Bajo
LCA: Ancestro Comun
mas
1

6
7

11

10

12

13

14
8

15

((( )( )(( ( )( )))( ))( )(( )((( )))))


G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Bajo
LCA: Ancestro Comun
mas
I

Primero calculamos los lmites de bloques y superbloques


involucrados:
sx = bx/sc, sy = by /sc, bx = bx/bc, by = by/bc.

Luego tomamos el mnimo exceso de 5 rangos:


I

Los superbloques contenidos en [x, y ], es decir


[1 + sx s, sy s].
Los bloques contenidos en [x, y ] que preceden a sx , es
decir [1 + bx b, sx s].
Los bloques contenidos en [x, y ] que siguen a sy , es decir
[1 + sy s, by b].
Las posiciones contenidas en [x, y] que preceden a bx , es
decir [x, bx b].
Las posiciones contenidas en [x, y] que siguen a by , es
decir [1 + by b, y].
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Bajo
LCA: Ancestro Comun
mas
Resolviendo los Superbloques
I

Si almacenaramos
el mnimo exceso dentro de cada par
de superbloques, ocuparamos demasiado espacio.

Utilizaremos la propiedad siguiente: Si a < b < c < d,


entonces min[a, d] = min(min[a, c], min[b, d]).

Almacenaremos una tabla


del mnimo exceso
M[i, j] = posicion
en los superbloques [i, i + 2j 1]

Entonces
min[1 + sx s, sy s] = min(M[sx , j], M[sy 2j + 1, j])
donde j = blog(sy sx + 1)c.
G. Navarro

Estructuras de Datos Compactas

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Arboles
Textos
Grafos

Bajo
LCA: Ancestro Comun
mas

((( )( )(( ( )( )))( ))( )(( )((( )))))


1
7
17
19
30
1
17
19
30
1
30
G. Navarro

Estructuras de Datos Compactas

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Arboles
Textos
Grafos

Bajo
LCA: Ancestro Comun
mas
Espacio para los Superbloques
I

para rangos
Notar que almacenamos las soluciones solo
cuyo largo es potencia de 2.

Todo rango de largo arbitrario se resuelve superponiendo


dos rangos de largo potencia de dos que lo cubran.

Si hay t superbloques, M tiene t log t celdas.

El total de bits que ocupa es


t log t log n

log3 n

G. Navarro

log n = O

n
log n

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Bajo
LCA: Ancestro Comun
mas
Resolviendo los Bloques
I

Usamos el mismo esquema a nivel de bloques,


internamente a cada superbloque.

Como las posiciones son internas a los superbloques,


caben en 3 log log n bits.

El total de bits que se ocupa es


s
(log log n)2
n s
log 3 log log n = 12 n
(1 + o(1))
s b
b
log n

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Bajo
LCA: Ancestro Comun
mas

Resolviendo dentro de un Bloque


I

del
Usamos una tabla tipo T que almacene la posicion
mnimo exceso dentro de cada bloque posible.

T necesita O( n log log n) bits.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Bajo
LCA: Ancestro Comun
mas
Finalmente...
I

Una vez que tenemos los 5 candidatos p1 . . . p5 a posicion


del mnimo exceso...

... calculamos
m = argminpi exceso(pi )

... y respondemos
LCA(v , v 0 ) = enclose(m)

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

RMQ: Mnimos en Rangos

con arboles.

Un problema en principio sin relacion

Tengo un arreglo de numeros


A[1, n], que puedo

preprocesar.

Luego, dados rangos [i, j], necesito saber min A[i . . . j].

Se puede resolver en tiempo constante usando solamente


4n + o(n) bits extra!

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

RMQ: Mnimos en Rangos


I

El arbol
cartesiano de A[1, n] se define as:
I
I
I
I

del min A[i . . . j].


Sea m la posicion

Entonces el arbol
tiene una raz con hijos T1 y T2 .

T1 es el arbol
cartesiano de A[1, m 1].

T2 es el arbol
cartesiano de A[m + 1, n].

El arbol
tiene n nodos.

Sea H[1, n] la secuencia de las profundidades de los


nodos.
del mnimo en A[i . . . j] es la misma posicion

La posicion
del mnimo en H[i . . . j].

Pues corresponde al LCA(i, j) en el arbol


cartesiano.

G. Navarro

Estructuras de Datos Compactas

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Arboles
Textos
Grafos

RMQ: Mnimos en Rangos


1
3
7

2
15

21

14

12

11

13

10
17

16

20
1

18

19
6

10

11

12

13

14

15

16

17

18

19

20

21

3 2 5 4 6 5 3 1 2 0 4 3 4 2 4 5 3 1 3 2 3
1

10

11

12

13

14

15

16

17

18

19

20

21

A 21 7 12 9 20 11 8 3 15 1 13 5 17 4 16 19 10 2 14 6 18
G. Navarro

Estructuras de Datos Compactas

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Arboles
Textos
Grafos

RMQ: Mnimos en Rangos


I

Supongamos H[0] = H[n + 1] = 0 y generemos una


secuencia a partir de H:
I
I

Si H[i] > H[i 1], agregamos H[i] H[i 1] smbolos (.


Si H[i] < H[i 1], agregamos H[i 1] H[i] smbolos ).

en parentesis

El resultado es S[1, 2n], la representacion

del arbol
cartesiano.

El mnimo en H corresponde al min[x, y ] en S.

Marcamos en otro bitmap P[1, 2n] las posiciones donde


de cada valor de H en S.
comienza la codificacion

Entonces,
RMQ(i, j) = A[rank(P, min[select(P, i), select(P, j+1)1])]
S

se resuelve en tiempo constante.


G. Navarro

Estructuras de Datos Compactas

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Arboles
Textos
Grafos

RMQ: Mnimos en Rangos


1
3

15

21

14

12

11

13

10
17

16

20
1

19

18

10

12

13

14

15

16

17

18

19

20

3 2

( ( ( ) ( ( ( ) ( ( ) ) ) ) ) ( ) ) ( ( ( ( ) ( ) ) ( ( ( ) ) ) ) ( ( ) ( ) ) )

1001100110110101101000111010110101011100

G. Navarro

11

Estructuras de Datos Compactas

21

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Parte II: Otras Estructuras


Arboles
con Parentesis

Representacion

a Mnimos en Rangos
Navegando en Parentesis,
aplicacion
de Arboles
Otra Representacion
Textos
El Arreglo de Sufijos Comprimido
de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

usando Parentesis

Otra Representacion
I
I

usada tiene muchas bondades.


La representacion
importante:
Pero es ineficiente para una operacion

hijo(v , i) es el i-esimo
hijo de v .

Lo podemos hacer en tiempo O(i), pero eso puede ser

muy lento en ciertos arboles.


alternativa que resuelve esto
Veremos una representacion
en tiempo constante.
puede calcular la cantidad de hijos (aridad) de v
Tambien
en tiempo constante.
permitira comprimir el arbol!

Y tambien

A cambio, no permite conocer la profundidad de v .

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

usando Parentesis

Otra Representacion
I

Usaremos parentesis
balanceados, pero con otro
significado.

Un nodo v con hijos v1 , v2 , . . . , vk se representara como


R(v )

( ( . . . ( ) R(vk ) . . . R(v2 ) R(v1 )


| {z }
k

El nodo v corresponde a su primer parentesis.

Una hoja se representa como ).

Propiedad importante: Todo arbol


termina con ), y su
exceso interno es 1.

I
I

Agregamos un ( a S para que quede balanceada.

En total S queda con 2n parentesis


balanceados!
G. Navarro

Estructuras de Datos Compactas

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

Arboles
Textos
Grafos

usando Parentesis

Otra Representacion
1

6
7

11

10

12

13

14
8

15

(((( ) (( )( )())))(((( )) ( ) (( )))))


G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

usando Parentesis

Otra Representacion

Utilizaremos las mismas operaciones open, close y

enclose para navegar en esta nueva representacion.

La aridad de un nodo es
select) (S, rank) (S, v 1) + 1) v .

El i-esimo
hijo de v es close(v + i 1) + 1

I
I
I

El padre de v es 1 + select) (S, rank) (S, open(v 1))).


Puedo saber que hijo soy de mi padre:
open(v 1) padre(v ) + 1

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

usando Parentesis

Otra Representacion
I

Con las operaciones anteriores tengo automaticamente


los
hermanos.

I
I

Los ancestros siguen conteniendo a sus descendientes.


tipo preorden.
Con rank) (S, v ) tengo numeracion

tamano
de subarbol.

Por lo tanto, tengo tambien

Contando () tengo cantidad de nodos internos.

Con ambos, tengo cantidad de hojas.


puede resolverse LCA practicamente

Tambien
del mismo
modo.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

con Parentesis

Representacion

Navegando entre Parentesis


de Arboles
Otra Representacion

usando Parentesis

Otra Representacion
Comprimiendo
I

es la secuencia de las
Realmente esta representacion
aridades en preorden, escritas en unario.

Se podran representar como numeros


y comprimir la

secuencia a orden cero.

Eso comprime si existe regularidad en las aridades del

arbol.

No veremos el detalle, es demasiado tecnico.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

de Secuencias
Textos: Otra Vision

...
Dado un alfabeto de tamano

... un texto T [1, n] es una secuencia sobre .

Eso no es lo mismo que una secuencia?

S, pero nos interesan otras operaciones.


P[1, m]:
Dado un patron

I
I

Contar la cantidad de ocurrencias de P en T (occ).


Ubicar esas occ ocurrencias en T .

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

de Secuencias
Textos: Otra Vision
I

Cuando el texto no es muy largo, o cambia muy


frecuentemente, lo mejor es la busqueda
secuencial.

Pero en el mejor caso esto cuesta O(

queremos
Cuando el texto es de lenguaje natural y solo
buscar palabras y frases, lo mejor es un ndice invertido.

Esto es un vocabulario de las palabras distintas, y una lista


de ocurrencias de cada una.

No es difcil conseguir poco espacio con


bitmaps comprimidos para las listas.

Otras variantes se especializan en calculo


de relevancia.

G. Navarro

n log m
).
m

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

de Secuencias
Textos: Otra Vision
I
I
I
I

I
I

Los ndices invertidos funcionan muy bien.


Son usados por buscadores como Google y Yahoo!.
Uno de sus grandes desafos es unir e intersectar listas.
Y en eso son utiles
los resultados que vimos para

relaciones binarias.
Pero no todo se puede resolver con ndices invertidos.
lenguaje natural implica muchas
La expresion
suposiciones:
I
I

El texto se puede cortar automaticamente


en palabras.
querra buscar palabras o secuencias de
El usuario solo
palabras.
El conjunto de palabras distintas (vocabulario) crece
sublinealmente con n (ley de Heaps).
Las frecuencias de las palabras se distribuyen muy
desigualmente (leyes de Zipf o Mandelbrot).
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

de Secuencias
Textos: Otra Vision
I

Lenguaje natural excluye lenguajes muy naturales como


coreano...
el chino, japones,

y
... e incluso occidentales (aglutinantes) como aleman

finlandes!
Hay secuencias donde no existe el concepto de palabra en
absoluto:

I
I
I

Secuencias biologicas
(ADN o protenas).
Secuencias musicales (valores de pitch en archivos MIDI).

Senales
discretizadas.

Hay otras donde podran definirse palabras, pero no


palabras, o no siguen las leyes:
interesa buscar solo
I
I

Codigo
fuente en lenguajes de programacion.

Secuencias numericas
o de codigos
de algun
tipo.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

Arboles y Arreglos de Sufijos

potente que los


Veremos un tipo de ndice mucho mas
ndices invertidos.
sobre el texto.
No hacen ninguna suposicion

Permiten buscar cualquier substring del texto.

Modelo general: considerar los n sufijos T [i, n] de T .

Todo substring de T es el prefijo de un sufijo de T .

Estas estructuras indexan el conjunto de sufijos de T y


permiten encontrar todos los que comparten un cierto
prefijo.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

Arboles y Arreglos de Sufijos


Arbol de Sufijos
I

Es un arbol
digital que contiene todos los sufijos de T .

I
I

Consideraremos que T termina con un smbolo especial $.

Cada hoja del arbol


corresponde a un sufijo distinto de T .

Y cada nodo interno a un substring repetido de T .

Se comprimen caminos unarios para garantizar O(n log n)


bits.

Se puede construir en tiempo O(n) si = O(n) es


discreto.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

$
21

alabar a la alabarda$ _
1
G. Navarro

_
4

bar

laba

_ d
3
15

_
10

_ d
5 17

bar

_
7

l 20 $_
a
l 9
l
11
12
8

18

_
6

ba r

la

19

d
16

d
13
Estructuras de Datos Compactas

_
2

d
14

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

Arboles y Arreglos de Sufijos


I

Para buscar P, se intenta bajar en el arbol


usando sus
caracteres.
I

I
I

Si agoto P en una arista, el subarbol


que desciende agrupa
todas las ocurrencias de P.
Si no puedo bajar por un cierto P[i], entonces P no
aparece en T .
Si llego a una hoja, hay a lo sumo una ocurrencia, que
debo terminar de verificar en T .

Cuenta en tiempo O(m), ubica en tiempo O(m + occ).


complejos.
Puede resolver muchos otros problemas mas

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

Arboles y Arreglos de Sufijos


I

El arbol
de sufijos es una de las estructuras de datos mas
elegantes y utiles,
pero ocupa muchsimo espacio.

Puede requerir de 10n a 20n bytes, por ejemplo 30-60 GB


para el genoma humano.
bastante exitosa para reducir su espacio es
Una solucion
el arreglo de sufijos.

Este es el arreglo de las hojas del arbol


de sufijos.

Con las tecnicas


para representar arboles...

... podemos representar el arbol


de sufijos como

I
I
I

El arreglo de sufijos.

2n parentesis
para la estructura de arbol.
que se desee.
El espacio extra para la navegacion

comprimir el arreglo de sufijos.


Por lo tanto, tiene interes
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

$
21

a
r

_
4

_
1

_
_
10
d
16

18
6

bar

_d
5 17

_ d
3
15

la

19

laba

l 20 $_
a
l 9
11 l
12
8

bar

_
7

bar

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

_
2

d
14

d
13

(()((()())())(()(()())(()())(()())(()()))(()())()(()(()()))(()()))
alabar a la alabarda$

bar

21 7 12 9 20 11 8 3 15 1 13 5 17 4 16 19 10 2 14 6 18

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

Arboles y Arreglos de Sufijos


Arreglo de Sufijos
I

puede funcionar sin el arbol.

Un arreglo de sufijos tambien


I
I
I

No puede hacer todo lo que un arbol


de sufijos.
Pero s puede buscar patrones, en tiempo O(m log n + occ),
... y varias otras cosas.

Todo subarbol
del arbol de sufijos corresponde a un
intervalo del arreglo de sufijos.

Se puede hacer una busqueda


binaria de los sufijos que

empiezan con P.

El rango resultante contiene todas las respuestas...

... y corresponde al subarbol


que habramos encontrado

en el arbol
de sufijos.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

bar
21 7 12 9 20 11 8 3 15 1 13 5 17 4 16 19 10 2 14 6 18

al abar

G. Navarro

l a

al abar da$

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

Arboles y Arreglos de Sufijos

Aun
solo, el arreglo de sufijos presenta problemas de
espacio.

I
I

Ocupa unos 4n bytes (12GB para el genoma humano).


comprimirlo.
Nuevamente, es de interes

Pero... se puede comprimir una permutacion?.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

Parte II: Otras Estructuras


Arboles
con Parentesis

Representacion

a Mnimos en Rangos
Navegando en Parentesis,
aplicacion
de Arboles
Otra Representacion
Textos
El Arreglo de Sufijos Comprimido
de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

El Arreglo de Sufijos Comprimido


I
I

Un arreglo de sufijos no es cualquier permutacion.


n
arreglos de
Hay n! permutaciones posibles pero solo
sufijos posibles.

Como
se refleja la compresibilidad de un texto en su arreglo de
sufijos?

De que tipo de compresibilidad de textos estamos hablando?

Concentremosnos
en una que es importante en la

practica:
entropa de orden k.
I

de alfabeto y sesgo en la
Orden cero captura tamano
frecuencia de los smbolos.
Ordenes mayores capturan la predictibilidad del texto que
sigue en base a lo que lo precede.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

El Arreglo de Sufijos Comprimido



La funcion
I
I

Llamemos A[1, n] al arreglo de sufijos de T [1, n].


y A1 como
Podemos pensar en A como una permutacion
su inversa.
(1..n) como
Definiremos una funcion
(i) = A1 [A[i] + 1]
(con el caso especial (i) = A1 [1] si A[i] = n).

Dicho de otro modo,


A[(i)] = A[i] + 1.

Dada una celda A[i] que apunta al sufijo T [A[i] . . .], dice

donde
esta en A el puntero al siguiente sufijo.
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

10 7 11 17 1 3 4 14 15 18 19 20 21 12 13 5 6 8 9 2 16
1

10

11 12

13

14

15

16

17

18

19

20

21

A 21 7 12 9 20 11 8 3 15 1 13 5 17 4 16 19 10 2 14 6 18
D

1 1 0 0 1 0 0 0

$ _ a b d l r

0 0 0 0 0 1 0 1 1 0 0 1 0

al abar

G. Navarro

l a

al abar da$

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

El Arreglo de Sufijos Comprimido


I

C(1..) como
Definamos la funcion
C(c) = cantidad de ocurrencias de smbolos < c en T

Implementemos C con
I

I
I

Un bitmap D[1, n], con D[1] = 1 y D[C(c) + 1] = 1 para


todo c .
Una lista S[1, ] de los distintos caracteres que aparecen

en T , en orden alfabetico.

D y S se pueden representar con O( log n) bits.


que realmente me interesara es
La operacion
c = S[rank(D, i)]
es decir, con que caracter comienza T [A[i]].
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

El Arreglo de Sufijos Comprimido


I
I

Veamos como
extraer T [A[i] . . .] sin A ni T ...
... sino con D, S y .
I
I
I
I

T [A[i]] es S[rank (D, i)].


T [A[i] + 1] = T [A[(i)] es S[rank(D, (i))].
T [A[i] + 2] = T [A[2 (i)] es S[rank (D, 2 (i))].
...

Podemos implementar la busqueda


binaria en el mismo

tiempo.

Podemos contar en tiempo O(m log n).

Pero... es tan grande como A!

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

El Arreglo de Sufijos Comprimido


I

es compresible cuando T es compresible.

En la zona de A donde los sufijos comienzan con la misma


letra, es creciente.

Por lo tanto consiste de listas crecientes.

Con bitmaps comprimidos se pueden representar usando


X
c

I
I

nc log

n
+ O(n) + o(n) = nH0 (T ) + O(n) + o(n) bits
nc

Con D tenemos acceso en tiempo constante a .


debemos sumar los O( log n) bits de D y S, pero
Ademas
eso normalmente puede ignorarse.
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

El Arreglo de Sufijos Comprimido


I

El problema es el espacio extra o(n).

Lo podemos convertir en O(n log log ) usando


delta.
codificacion
gama de un numero
Comencemos con la codificacion
x:

I
I
I

Codificamos |x| en unario.


Luego codificamos x en binario
Por ejemplo x = 20 = 10100 se codifica como
10000 10100

El codigo
necesita 2dlog(x + 1)e bits.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

El Arreglo de Sufijos Comprimido

El codigo
delta funciona as:
I
I
I

Codificamos |x| con codigo


gama.
Luego codificamos x en binario
Por ejemplo x = 20 = 10100 (|x| = 5 = 101) se codifica
como
100 101 10100

El codigo
necesita dlog(x + 1)e + 2dlog(dlog(x + 1)e + 1)e
bits.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

El Arreglo de Sufijos Comprimido


I

Si codificamos (i) (i 1) en las zonas crecientes

usando codigos
delta, obtenemos
nH0 (T ) + O(n log log ) bits.

Agregamos valores absolutos cada O(log n) bits (agrega


O(n) bits).

Y con eso podemos decodificar cualquier (i) en tiempo


constante.
Notar que:

I
I

No necesitamos A ni T .
Aun
podemos contar en tiempo O(m log n).

aun...
Pero se puede comprimir mas

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

El Arreglo de Sufijos Comprimido

Si una cadena abcd se repite frecuentemente en T ...


habra una zona en A con los punteros que apuntan a las a
y otra con los punteros que apuntan a las b...
los mismos de las a desplazados en 1.
... que seran

Estas seudo-copias en A se llaman runs.

Un run se ve en como una secuencia de valores


consecutivos.

Codificando los runs en forma especial, nos acercamos a


la entropa de orden superior.
Todo esta muy bien, pero

I
I

I
I

Podemos ubicar las ocurrencias, si no tenemos A?


Podemos mostrar una parte del texto, si no tenemos T ?
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

10 7 11 17 1 3 4 14 15 18 19 20 21 12 13 5 6 8 9 2 16
1

10

11 12

13

14

15

16

17

18

19

20

21

A 21 7 12 9 20 11 8 3 15 1 13 5 17 4 16 19 10 2 14 6 18

al abar

G. Navarro

l a

al abar da$

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

El Arreglo de Sufijos Comprimido


I

Haremos un sampling de celdas de A y las


almacenaremos.

Tomaremos los A[i] que apuntan a posiciones de T


multiplos
de b.

Los almacenaremos en orden creciente de i en forma


contigua, en un arreglo A0 [1, n/b].

... y tendremos un bitmap B[1, n] marcando los i


sampleados.
O( bn log n) bits.
Las posiciones y el bitmap ocuparan

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

El Arreglo de Sufijos Comprimido


I

Supongamos que queremos conocer A[i] (pero no


tenemos A).
I
I

I
I

Si B[i] = 1, A[i] = A0 [rank (B, i)].


Sino, si B[(i)] = 1, A[(i)] = A0 [rank (B, (i))],
A[i] = A[(i)] 1.
Sino, ...
Si B[t (i)] = 1, A[i] = A0 [rank (B, t (i))] t.

Esto debe terminar en a lo sumo b pasos.

Por lo tanto podemos conocer A[i] en tiempo O(b).

Por ejemplo, en tiempo O(log n), gastando O(n) bits extra.

Ahora s hemos reemplazado al suffix array!

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

10 7 11 17 1 3 4 14 15 18 19 20 21 12 13 5 6 8 9 2 16
1

10

11 12

13

14

15

16

17

18

19

20

21

A 21 7 12 9 20 11 8 3 15 1 13 5 17 4 16 19 10 2 14 6 18
B

1 0 0 0 0 1 0 0

0 1 0 0 0 0 1 0 0 0 0 1 0

A 21 11 1 16 6
E 10 20 6 15 1

al abar

G. Navarro

l a

al abar da$

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

El Arreglo de Sufijos Comprimido


I
I
I

Ahora almacenaremos el mismo sampling de otra forma.


Almacenaremos los valores i en orden creciente de T , en
E[1, n/b].
Supongamos que queremos conocer T [l, r ] (pero no
tenemos T ).
I
I
I
I
I
I

I
I

sampleada es l 0 = 1 + bl/bc b.
La ultima
posicion

Y es apuntada desde A[i] = A[E[1 + bl/bc]].


Sabemos que T [l 0 ] = S[rank(D, i)].
Sabemos que T [l 0 + 1] = S[rank (D, (i))].
...
0
Sabemos que T [r ] = S[rank (D, r l +1 (i))].

El costo total es O(b + r l).


Por ejemplo, en tiempo O(r l + log n), gastando O(n)
bits extra.
Ahora s hemos reemplazado al texto!
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

El Arreglo de Sufijos Comprimido


I

Todas las estructuras suman nH0 (T ) + O(n log log ) bits.

Se puede probar que realmente suman


nHk (T ) + O(n log log ) bits para k moderado.

Permiten contar en tiempo O(m log n).

Permiten ubicar cada ocurrencia en tiempo O(log n).

Permiten mostrar T [l, r ] en tiempo O(r l + log n).

Estas estructuras reemplazan el suffix array pero tambien


reemplazan el texto!
Cuando logramos esto, tenemos un auto-ndice
comprimido.

I
I
I

Representa el texto.
Permite busqueda
indexada.

Ocupa espacio cercano al del texto comprimido.


G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

Parte II: Otras Estructuras


Arboles
con Parentesis

Representacion

a Mnimos en Rangos
Navegando en Parentesis,
aplicacion
de Arboles
Otra Representacion
Textos
El Arreglo de Sufijos Comprimido
de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

de Burrows-Wheeler (BWT)
La Transformacion

reversible de T .
Es una permutacion

Se usa como paso previo a algoritmos de compresion


como bzip2.

Pone juntos caracteres que tienen el mismo contexto.

Basta comprimir esos caracteres juntos a orden cero


para obtener nHk (T ).
deriva en un ndice comprimido para
Veremos que ademas
texto.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

de Burrows-Wheeler (BWT)
La Transformacion
I
I
I
I
I

Tomamos todos los shifts cclicos de T .


Es decir, ti ti+1 . . . tn1 $t1 t2 . . . ti1 .
El resultado es una matriz M de n n caracteres.

Ordenamos las filas lexicograficamente.


M es esencialmente la lista de los sufijos de T en orden:
M[i] = T [A[i] . . . n] T [1 . . . A[i] 1]

I
I
I

La primera columna, F , tiene los primeros caracteres de


los sufijos: F [i] = S[rank(D, i)].
La ultima
columna, L, es la BWT de T , T bwt = L.

Es la secuencia de los caracteres que preceden a los


sufijos T [A[i]..].
L[i] = T bwt [i] = T [A[i] 1]
(excepto si A[i] = 1, donde T bwt = T [n] = $).
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

A
21 7 12 9 20 11 8 3 15 1 13 5 17 4 16 19 10 2 14 6 18

alabar a la alabarda$
labar a la alabarda$a
abar a la alabarda$al
bar a la alabarda$ala
ar a la alabarda$alab
r a la alabarda$alaba
a la alabarda$alabar
a la alabarda$alabar
la alabarda$alabar a
la alabarda$alabar a
a alabarda$alabar a l
alabarda$alabar a la
alabarda$alabar a la
labarda$alabar a la a
abarda$alabar a la al
barda$alabar a la ala
arda$alabar a la alab
rda$alabar a la alaba
da$alabar a la alabar
a$alabar a la alabard
$alabar a la alabarda

$alabar a la alabarda
a la alabarda$alabar
alabarda$alabar a la
la alabarda$alabar a
a$alabar a la alabard
a alabarda$alabar a l
a la alabarda$alabar
abar a la alabarda$al
abarda$alabar a la al
alabar a la alabarda$
alabarda$alabar a la
ar a la alabarda$alab
arda$alabar a la alab
bar a la alabarda$ala
barda$alabar a la ala
da$alabar a la alabar
la alabarda$alabar a
labar a la alabarda$a
labarda$alabar a la a
r a la alabarda$alaba
rda$alabar a la alaba

G. Navarro

1era "a"

alabar a la alabarda$

1era "d"

bwt

araadl ll$ bbaar aaaa

2nda "r"

9na "a"

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

de Burrows-Wheeler (BWT)
La Transformacion
I
I
I
I
I

Como
invertir la BWT?
Para todo i, T = . . . L[i]F [i] . . ..
Sabemos que L[1] = T [n 1], pues F [1] = $ = T [n].

Donde
esta c = L[1] en F ?
Todas las ocurrencias de c aparecen en el mismo orden
en F y L:
I

I
I
I

Es el orden dado por el sufijo que sigue a c en T .

Sea entonces j = rankc (L, i).


Ese c esta en F [C(c) + j].
Se llama LF-mapping, pues lleva de la columna L a la F :
LF (i) = C(L[i]) + rankL[i] (L, i)

I
I

Entonces T [n 2] = F [LF (1)] = S[rank(D, LF (1))].


Y T [n 3] = F [LF (LF (1))], etc.
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

El FM-Index
I

Usaremos el paralelo entre el arreglo de sufijos y la BWT.

Reemplazaremos la busqueda
binaria por la busqueda

mas
eficiente.
hacia atras,

Para buscar P[1, m] comenzaremos por pm .

El segmento de A que le corresponde es


A[C(pm ) + 1, C(pm + 1)].

En general, sabremos que las ocurrencias de P[i + 1, m]


comienzan en A[spi+1 , epi+1 ]...

... y usaremos algo similar al LF-mapping para obtener la


zona A[spi , epi ] correspondiente a P[i, m].

Terminaremos con sp1 y ep1 .

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

El FM-Index
I

Supongamos que conocemos el segmento A[spi+1 , epi+1 ]


de las ocurrencias de P[i + 1, m].

Como
lo actualizamos a las ocurrencias de P[i, m]?
I
I

Para un spi+1 j epi+1 , M[j][1..m i] = P[i + 1, m].


Las ocurrencias de P[i, m] en T aparecen como L[j] = pi

en esa area,
pues T = . . . L[j] M[j][1..m i] . . .
Por lo tanto la respuesta es el rango de los LF (j) donde
L[j] = pi .

Eso se calcula simplemente como


spi

= C(pi ) + rankpi (L, spi+1 1) + 1

epi

= C(pi ) + rankpi (L, epi+1 )

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

araadl ll$ bbaar aaaa

C(_)=1
C(a)=4
C(b)=13
C(d)=15
C(l)=16
C(r)=19

G. Navarro

$
_
_
_
a
a
a
a
a
a
a
a
a
b
b
d
l
l
l
r
r

a
r
a
a
d
l
_
l
l
$
_
b
b
a
a
r
_
a
a
a
a

3 15 1 13 5 17 4 16 19 10 2 14 6 18

C($)=0

21 7 12 9 20 11 8

bwt

T alabar a la alabarda$

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

El FM-Index
I

Luego de m iteraciones, tenemos el intervalo de P[1, m].

El costo son 2m invocaciones de rankc .


Usando un wavelet tree sobre T bwt = L,

I
I

Obtenemos espacio nH0 (T ) + o(n log ).


Contamos en tiempo O(m(1 + logloglog n )).

El espacio nH0 (T ) se puede mejorar a nHk (T ):


I

I
I

Particionando L en bloques que comparten el mismo prefijo


M[j][1, k ].

Particionando L en forma optima


(vale para todo k ).
Usando bitmaps comprimidos en el wavelet tree, lo que da

nHk (T ) automaticamente
para todo k .

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

a = 0, rank0(16) = 10

ar aadl _ l l $_bbaar_ aaaa


010011011000000100000
$_ab

dlr

a = 1, rank1(10) = 7

aaa_$_bbaa_aaaa
111000111101111
ab

$_

dl

a = 0, rank0(7) = 5

_$__
1011
$

r dl l l r
100001

aaabbaaaaaa
00011000000
_

dl l l
0111
d

rank = 5

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

El FM-Index

Para obtener A[i] y T [l, r ] usamos el mismo mecanismo de


sampling.
Para conservar o(n log ) espacio extra,
I
I
I

I
I

Sampleamos cada b = log n log log n.


Ubicamos cada ocurrencia en tiempo O(log n log log n).
Mostramos texto en O((b + r l)(1 + logloglog n )).

Es uno de los mejores ndices en la teora.

pero el suffix array comprimido es


En la practica
tambien,

muy competitivo tambien.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

Parte II: Otras Estructuras


Arboles
con Parentesis

Representacion

a Mnimos en Rangos
Navegando en Parentesis,
aplicacion
de Arboles
Otra Representacion
Textos
El Arreglo de Sufijos Comprimido
de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

Indices tipo Lempel-Ziv

I
I
I

basado en sustituir
Lempel-Ziv es un tipo de compresion
cadenas de T por punteros a sus apariciones previas.
repetitivo es un texto, mas
se puede
Cuanto mas
reemplazar y mejor se comprime.
Los compresores zip, gzip, pkzip, arj, etc. son de este tipo.
Nos interesara un tipo particular llamado LZ78.
Veremos que tiene propiedades que permiten indexar el
texto comprimido.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

Indices tipo Lempel-Ziv


LZ78
Compresion
I

Cortamos el texto en frases.

larga posible y
Cada frase consiste en la frase previa mas
una letra adicional.

Todas las frases son distintas.

Se almacenan todas las frases en un arbol


digital, donde
cada nodo es una frase.

En el peor caso se forman n0 n/ log n frases en T .

Representando cada frase con log n bits el total queda


nHk (T ) + o(n log ) para k = o(log n).

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

[Link]. .a .la. [Link].a$


0
_
5

1
$

a
8

11

2
b

4
d
10

G. Navarro

7
b
9

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

Indices tipo Lempel-Ziv


El LZ-Index
I

El LZ-Index almacena varias componentes:


I

I
I
I

los
LZTrie: el arbol
de las frases, como 2n0 parentesis
mas
numeros
de frases en preorden (Ids).

RevTrie: el arbol
de las frases reversas, como 4n0

los numeros
parentesis
mas
de frase en preorden (RIds).

Node: el mapeo de numero


de frase a nodos de LZTrie.

RNode: el mapeo de numero


de frase a nodos de RevTrie.

Range: puntos en dos dimensiones:


(preordenRev (j), preordenLZ (j + 1)) para cada frase j.

Con esas estructuras puede ubicar las ocurrencias en


tiempo O(m2 log m + (m + occ) log n).

En la practica
el conteo es muy lento, pero ubicar las

ocurrencias es rapido.
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

[Link]. .a .la. [Link].a$


LZTrie

RevTrie
0

0
_

1
$

a
8

11

_
6

a
4
d
10

2
b r

$ _

7
b
9

G. Navarro

a
11

_ l

a
7

3
l
9

4
a
10

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

$a
_
_a
a
a_
al
ba
bal
dra
l
ra

[Link]. .a .la. [Link].a$

_
_a
a
a$
a_
ab
ar
ard
l
la
lab

4
7
10
5
2
3
9
1
6
8

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

Indices tipo Lempel-Ziv

Tres tipos de ocurrencias a encontrar:


I
I
I

Tipo 1: P esta totalmente contenido en una frase.


Tipo 2: P traslapa con dos frases consecutivas.

Tipo 3: P abarca tres frases o mas.

frases LZ78
1

P dentro de
una frase

P traslapa
2 frases

G. Navarro

5 6

P abarca
4 frases

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

Indices tipo Lempel-Ziv


Ocurrencias tipo 1
I

Si una frase B contiene P pero no termina en P...

... y dado que B = B 0 c para otra frase B 0 y caracter


c...

... se deduce que P esta contenido en B 0 tambien.

Buscamos P R en RevTrie para hallar todas las frases que


terminan con P.

Para cada una de esas posiciones en preorden j de


en el LZTrie.
RevTrie, Node(Rids(j)) es la posicion

I
I

Todos los descendientes de ese nodo son ocurrencias.

Recorremos el subarbol
de LZTrie reportando los Ids.

O(1) por cada ocurrencia.


Tardamos O(m) mas

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

Indices tipo Lempel-Ziv


Ocurrencias tipo 2
I

Si P comienza en la frase Bj y termina en Bj+1 ...

... entonces Bj termina con P[1, i] y Bj+1 empieza con


P[i + 1, m] para algun
i.

Buscamos cada P[i + 1, m] en LZTrie, obteniendo el rango

de preordenes
[xi , xi0 ].

Buscamos cada P[1, i]R en RevTrie, obteniendo el rango

de preordenes
[yi , yi0 ].

Reportamos todos los puntos de Range en [xi , xi0 ] [yi , yi0 ].


O(log n) por ocurrencia.
El tiempo es O(m2 + m log n) mas

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

Indices tipo Lempel-Ziv

Ocurrencias tipo 3
I

de 2 frases, entonces contiene


Si P abarca mas
completamente una frase.

Como todas las frases del parsing LZ78 son distintas...

... existen a lo sumo O(m2 ) ocurrencias que verificar en T .

Se pueden verificar en tiempo O(m2 log m) usando Node y


RNode.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

Indices tipo Lempel-Ziv


I
I
I
I
I

I
I

Ids y Node son permutaciones inversas.


RIds y RNode son permutaciones inversas.
Por lo tanto, cada par ocupa (1 + )n log n bits.
La estructura de Range ocupa n log n bits.
En total el espacio es (3 + )nHk (T ) + o(n log ), para
cualquier constante .
Se puede eliminar Range para reducir el espacio a
(2 + )nHk (T ) + o(n log )...

... y los tiempos son mejores en la practica.


Para eliminar Range se verifican todos los candidatos de

LZTrie en RevTrie (usando Ids y RNode) o al reves


(usando RIds y Node).
El espacio se puede reducir incluso a
(1 + )nHk (T ) + o(n log ).
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

Comparando Indices para Texto


Lenguaje Natural

time (microsecs per occurrence)

english
30
25
Arreglo de Sufijos Comprimido
FM-Index con Wavelet Tree
FM-Index particionado
LZ-Index

20
15
10
5
0
0

0.5
1
1.5
2
Space usage (fraction of text)

2.5

Datos obtenidos por Rodrigo Gonzalez


y Rossano Venturini con los archivos del sitio [Link]
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

Comparando Indices para Texto

Codigo
Fuente

time (microsecs per occurrence)

sources
30
25
Arreglo de Sufijos Comprimido
FM-Index con Wavelet Tree
FM-Index particionado
LZ-Index

20
15
10
5
0
0

0.5
1
1.5
2
Space usage (fraction of text)

2.5

Datos obtenidos por Rodrigo Gonzalez


y Rossano Venturini con los archivos del sitio [Link]
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

Comparando Indices para Texto


Texto Semiestructurado

time (microsecs per occurrence)

xml
30
25
Arreglo de Sufijos Comprimido
FM-Index con Wavelet Tree
FM-Index particionado
LZ-Index

20
15
10
5
0
0

0.5
1
1.5
2
Space usage (fraction of text)

2.5

Datos obtenidos por Rodrigo Gonzalez


y Rossano Venturini con los archivos del sitio [Link]
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

El Arreglo de Sufijos Comprimido


de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv

Comparando Indices para Texto


ADN

time (microsecs per occurrence)

dna
30
25
Arreglo de Sufijos Comprimido
FM-Index con Wavelet Tree
FM-Index particionado
LZ-Index

20
15
10
5
0
0

0.5
1
1.5
2
Space usage (fraction of text)

2.5

Datos obtenidos por Rodrigo Gonzalez


y Rossano Venturini con los archivos del sitio [Link]
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Parte II: Otras Estructuras


Arboles
con Parentesis

Representacion

a Mnimos en Rangos
Navegando en Parentesis,
aplicacion
de Arboles
Otra Representacion
Textos
El Arreglo de Sufijos Comprimido
de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Grafos
I

Un conjunto de n nodos y e aristas.

Las aristas son flechas que van de un nodo a otro.

por
Los vecinos de un nodo son los alcanzables desde el
una flecha.
por una
Los vecinos reversos son los que llegan a el
flecha.

Nos interesa navegar de un nodo a sus vecinos o vecinos


reversos.
Y otras preguntas como
I
I
I

Existe una arista de un cierto nodo a cierto otro nodo?

Grado interior: cuantas


aristas llegan a un nodo?

Grado exterior: cuantas


aristas salen de un nodo?

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Grafos
I
I

Nos interesaremos especialmente en los grafos de la Web.


Se necesita correr algoritmos sobre grandes subconjuntos
de la Web.
I
I
I
I

I
I

Para calcular PageRank (Google).


Para descubrir comunidades (Yahoo!).

Para analisis
de redes sociales.
Y muchas otras aplicaciones.

Esos algoritmos no corren bien en memoria secundaria.


compacta navegable permitira
Una representacion
grandes en RAM.
analizar grafos mas

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Clasica

Representacion
de Grafos
Matriz de Incidencia
a
b

c d

a
b

c
d
e

d
e

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Clasica

Representacion
de Grafos

Matriz de Incidencia
I

Con n nodos y e aristas, ocupa n2 bits.

Responde existencia en tiempo O(1).

Encuentra todos los vecinos directos/reversos en O(n).

Calcula grado interior/exterior en O(n).

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Clasica

Representacion
de Grafos
Lista de Adyacencia
b

a: d,c,b

a: b

b: d,c,a

b: a

c: d

c: a,b,e

d:

d: a,b,c,e

e: d,c

e:

d
e

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Clasica

Representacion
de Grafos

Lista de Adyacencia
I

Con n nodos y e aristas, ocupa n log e + e log n bits.

Encuentra cada vecino en tiempo O(1).

Calcula grado exterior en tiempo O(1).

Responde existencia en tiempo O(n).

Necesita otro tanto para los reversos.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

de Grafos
Compresion

binaria entre nodos...


Viendolo
como una relacion

... se puede conseguir e log(n2 /e) (1 + o(1)) bits...

... y responder todo en tiempo O(log log n).

Obtiene lo mejor de los dos mundos...

... pero aun


no es demasiado bueno para la Web.

G. Navarro

Estructuras de Datos Compactas


Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Arboles
Textos
Grafos

de Grafos
Representacion
Algunos ejemplos sobre grafos Web
Medidos en bpe (bits por arista).
Grafo
UK
EU
Arabic
Indochina

n
18.5M
860K
23M
7M

e
298M
19M
640M
194M

G. Navarro

Matriz
1.15M
39K
827K
253K

Lista
25.89
20.81
25.51
23.73

2 x Lista
51.78
41.62
51.02
47.46

Estructuras de Datos Compactas

Rel. Bin
20.13
15.25
19.66
17.95

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

de Grafos
Compresion
Grafos Planares y Variantes
I
I

Con n nodos, tienen O(n) aristas.

Distintas tecnicas
para comprimirlos a O(n) bits.

La mayora consiste en dividirlos en varios arboles


y

representar estos arboles


como parentesis.

Algunas permiten acceso directo.

Hay algunos resultados para tipos especiales de grafos.

Es improbable que tengan algun


impacto en grafos Web.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

de Grafos
Compresion

Separadores de Grafos
I

Encontrar zonas que se pueden desconectar cortando


unas pocas aristas.

I
I

Renumerar los nodos y comprimirlos separadamente.


rapidos

Pueden obtener 1316 bpe y ser mas


que la
descomprimida (por efectos de cache).

version

Para vecinos reversos necesitan el grafo traspuesto.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

de Grafos Web
Compresion
I

sesgada de grados interior/exterior (power


Distribucion
laws).
I

Localidad de referencia: la mayora de los links apuntan al


mismo site.
I
I

Una lista de adyacencia tiene baja entropa.

Listar los nodos en orden lexicografico


de URL.

de gaps para comprimir las


Usar tecnicas
de codificacion
listas.

Modelo de copia: los links que salen se parecen a los de

alguna otra pagina.


I

Encontrar una pagina


similar y codificar diferencialmente.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

de Grafos Web
Compresion

Un muy buen exponente: WebGraph


I

pura.
3 bpe para compresion

6 bpe para recuperar cada vecino directo o reverso dentro


del microsegundo.

Esto considera el grafo y su traspuesto.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Parte II: Otras Estructuras


Arboles
con Parentesis

Representacion

a Mnimos en Rangos
Navegando en Parentesis,
aplicacion
de Arboles
Otra Representacion
Textos
El Arreglo de Sufijos Comprimido
de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Comprimiendo Grafos como Texto


I

Concatenar las listas de adyacencia en un texto.

Construir un autondice comprimido sobre ese texto.

Mostrar: vecinos de un nodo

Ubicar: vecinos reversos de un nodo

Contar: grado interior de un nodo

La entropa de orden k de este texto captura el modelo de


copia.
sesgada
La entropa de orden cero captura la distribucion
de grado interior.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Experimental
Comparacion

Usando el Arreglo de Sufijos Comprimido como


autondice.

Contra los resultados de WebGraph.

Sobre el mismo crawl UK, 18.5 Mnodos, 292 Mlinks.

Vecinos: resultados comparables.

Reversos: WebGraph el 10 veces mejor.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Retrieving neighbors

time per neighbor (ms)

CSA
WG
WG (fwd)

1.8
1.6
1.4
1.2
1
0.8
0.6
2

8
10
space (bpe)

G. Navarro

12

14

16

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Retrieving reverse neighbors

time per neighbor (ms)

30

CSA
WG

25
20
15
10
5
0
6

10
11
12
space (bpe)

G. Navarro

13

14

15

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Parte II: Otras Estructuras


Arboles
con Parentesis

Representacion

a Mnimos en Rangos
Navegando en Parentesis,
aplicacion
de Arboles
Otra Representacion
Textos
El Arreglo de Sufijos Comprimido
de Burrows-Wheeler y el FM-Index
La Transformacion
Indices tipo Lempel-Ziv
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Comprimiendo con Re-Pair

I
I

Hay una forma elegante y efectiva de comprimir T ?


repetido en T y
Re-Pair: encontrar el par mas
reemplazarlo por un nuevo smbolo, hasta que todos los
pares sean unicos.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Re-Pair

aaabcaabaaabcabdabd
a
a
b
c
b
d

a
b
c
a
d
a

4
5
2
2
2
1

ab

a a Ac a Aa a Ac Ad Ad
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Re-Pair

a a Ac a Aa a Ac Ad Ad
aa
aA
Ac
ca
Ad
cA
dA

2
3
2
1
2
1
1

A
B

ab
aA

a Bc Ba Bc Ad Ad
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Re-Pair

a Bc Ba Bc Ad Ad
aB
Bc
cB
Ba
cA
Ad
dA

2
2
1
1
1
2
1

A
B
C

ab
aA
Ad

a Bc Ba Bc CC
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Re-Pair

a Bc Ba Bc CC
aB
Bc
cB
Ba
cC
CC

2
2
1
1
1
1

A
B
C
D

ab
aA
Ad
Bc

a DB a DC C
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Re-Pair

a DB a DC C
aD
DB
Ba
DC
CC

2
1
1
1
1

EBECC

A
B
C
D
E

ab
aA
Ad
Bc
aD
diccionario
secuencia comprimida
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Re-Pair
I

Comprime bien, descomprime rapido.

Aprovecha la propiedad de copia.

Comprime mejor si se codifica T diferencialmente.


Se comporta bien en memoria secundaria

Siempre que el diccionario quepa en RAM.

Se puede mejorar Re-Pair mismo:


I

I
I

Representar el diccionario con estructuras de datos


compactas.
Ganamos hasta un 50% en el espacio del diccionario.
Esto es importante sobre todo en memoria secundaria.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Mejorando Re-Pair

Figuras hechas por mi alumno Rodrigo Gonzalez.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Mejorando Re-Pair

Figuras hechas por mi alumno Rodrigo Gonzalez.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Mejorando Re-Pair

Figuras hechas por mi alumno Rodrigo Gonzalez.

G. Navarro

Estructuras de Datos Compactas


Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Arboles
Textos
Grafos

Resultados Experimentales
UK: 18.5M nodos, 298M aristas
UK
Re-Pair
Re-Pair (diffs)
Plain
Compact

0.0005

0.0004

time (mseg/edge)

time (mseg/edge)

0.0005

0.0003
0.0002
0.0001
0

UK

Re-Pair
Re-Pair (diffs)
WG
WG-Memory

0.0004
0.0003
0.0002
0.0001

6
8
space (bits/edge)

10

12

10

15
20
25
space (bits/edge)

30

35

Resultados obtenidos por mi alumno Francisco Claude.

G. Navarro

Estructuras de Datos Compactas


Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Arboles
Textos
Grafos

Resultados Experimentales
EU: 860K nodos, 19M aristas
EU
Re-Pair
Re-Pair (diffs)
Plain
Compact

0.0005

0.0004

time (mseg/edge)

time (mseg/edge)

0.0005

0.0003
0.0002
0.0001
0

EU

Re-Pair
Re-Pair (diffs)
WG
WG-Memory

0.0004
0.0003
0.0002
0.0001

6
8
10
space (bits/edge)

12

14

10

15
20
25
space (bits/edge)

30

35

Resultados obtenidos por mi alumno Francisco Claude.

G. Navarro

Estructuras de Datos Compactas


Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Arboles
Textos
Grafos

Resultados Experimentales
Arabic: 23M nodos, 640M aristas
Arabic
Re-Pair
Re-Pair (diffs)
Plain
Compact

0.0005

0.0004

time (mseg/edge)

time (mseg/edge)

0.0005

0.0003
0.0002
0.0001
0

Arabic

Re-Pair
Re-Pair (diffs)
WG
WG-Memory

0.0004
0.0003
0.0002
0.0001

4
6
space (bits/edge)

10

10

15
20
25
space (bits/edge)

30

35

Resultados obtenidos por mi alumno Francisco Claude.

G. Navarro

Estructuras de Datos Compactas


Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Arboles
Textos
Grafos

Resultados Experimentales
Indochina: 7M nodos, 194M aristas
Indochina
Re-Pair
Re-Pair (diffs)
Plain
Compact

0.0005

0.0004

time (mseg/edge)

time (mseg/edge)

0.0005

0.0003
0.0002
0.0001
0

Indochina

Re-Pair
Re-Pair (diffs)
WG
WG-Memory

0.0004
0.0003
0.0002
0.0001

4
6
space (bits/edge)

10

10

15
20
25
space (bits/edge)

30

35

Resultados obtenidos por mi alumno Francisco Claude.

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Desafo Actual
I

Re-Pair obtiene 57 bpe y mejor compromiso


tiempo/espacio que WebGraph.

Podramos tener operaciones reversas eficientes con


1014 bpe.

binaria sobre Re-Pair?


Y si en vez tuvieramos
la relacion

I
I

I
I

Cada smbolo aparece de muchas formas distintas.


Hay que partir por encontrar que smbolos me representan
en el diccionario (rank y select sobre S!).
Vecinos y vecinos reversos: ok (O(1) por vecino).
Grado exterior/interior eficientes con 1 bpe extra cada uno.
(pero son compresibles a 0.170.25 bpe c/u).
Existe: Muy caro.

abierto.
Tema de investigacion
G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Eplogo
I

I
I
I
I

Las estructuras de datos compactas son un tema de


practico

interes
para obtener implementaciones eficientes
en los computadores modernos.

Son relevantes por las grandes cantidades de informacion


a manejar y por la jerarqua de memoria.
Combinan conceptos de algoritmos y estructuras de datos
y teora de la informacion.

con conceptos de compresion

Son un campo sumamente activo de investigacion.


esperando la contribucion
de jovenes

Y estan
entusiastas
y con talento!

G. Navarro

Estructuras de Datos Compactas

Arboles
Textos
Grafos

Representaciones Clasicas
y Comprimidas Generales
Comprimiendo Grafos como Texto
Comprimiendo con Re-Pair

Copyright
se distribuye bajo la licencia Attribute
Esta presentacion
Non-Commercial No Derivs de Creative Commons
[Link]
Esto significa que usted puede distribuir y comunicar
publicamente
la obra, siempre que

De credito
al autor de la obra.

No la use para fines comerciales.

No la altere, transforme, o genere una obra derivada.

El logo usado en esta presentacion


es cortesa de Jeremy Barbay,
[Link]/jbarbay.
G. Navarro

Estructuras de Datos Compactas

También podría gustarte