Compresión de Datos
Introducción
¿Por qué es importante conocer sobre Compresión?
FIUBA Organización de Datos - Curso Servetto 3
¿Por qué es importante conocer
sobre Compresión?
●Cada vez más información se maneja en forma
digital (Redes Sociales, digitalización de documentos).
●Cada vez se necesita más capacidad de
almacenamiento y transmisión de información (cloud computing)
●Cada vez se requiere un mejor uso de los recursos
FIUBA Organización de Datos - Curso Servetto 4
¿Qué area de la ciencia aplica?
● La compresión como álgebra, análisis
matemático, probabilidad y estadística y algoritmia aplicados.
FIUBA Organización de Datos - Curso Servetto 5
¿Qué conceptos
involucra?Teoría de la
Información
● Información (definición epistemológica)
● Datos Interpretados.
● Datos
● Característica (dimensión) + Valor (medida)
FIUBA Organización de Datos - Curso Servetto 6
Teoría de la Información
● Información (definición cuantitativa)
● Teorema de Shannon 1948 – matemática
estadística.
● PROBABILIDAD = ENTROPIA
● Información (definición analítica)
● Teorema de muestreo de Nyquist-Shannon 1949 –
matemática analítica.
FIUBA Organización de Datos - Curso Servetto 7
Teoría de la Información
● Información (definición cuantitativa)
FIUBA Organización de Datos - Curso Servetto 8
Teoría de la información
(matemática estadística)
● Entropía (definición estadístical)
● Teorema Shannon (información promedio).
● Dentro de una fuente F, recibimos el símbolo Fi, que
tenía probabilidad pi
FIUBA Organización de Datos - Curso Servetto 9
Teoría de la información
(matemática analítica)
● Transformada (definición analítica)
● Teorema de muestreo de Nyquist-Shannon 1949 (se
puede representar con elementos discretos la misma información que con elementos contiuos).
● => 0111010101011100101
● No importa el medio de transmisión, la información
FIUBA Organización de Datos - Curso Servetto 10
Representación de los Datos
(códigos de representación).
● Dentro de un medio digital, podemos representar
la información de diferentes formas.
COLOR = ROJO (texto)
677976798232613282797479 (ASCII)
0010000000100011110100010100001100010100101000010100110000010100111101000101001000 1000110011101111100001101111001010 (Binario comprimido)
FIUBA
Organización de Datos - Curso Servetto
11
Representación de los Datos
(códigos de representación).
● La representación resultante puede ser
– sin pérdida de información (existe un proceso inverso que
reconstruye exactamente los datos originales – o la representación original).
– “HOLA” => 01011101010100100 => “HOLA”
– con pérdida (no se puede reconstruir con exactitud, pero
se tiene control del error cometido).
FIUBA Organización de Datos - Curso Servetto 12
Representación de los Datos
(códigos de representación).
● Clasificación por longitud
– Longitud Fija
● Los ASCII:
0011 1000 0011 1110
– Longitud Variable:
● Los UNICODE variables:
100 1110 110 101000
FIUBA Organización de Datos - Curso Servetto 13
Representación de los Datos
(códigos de representación).
● Clasificación por Instantaneidad
– Código instantáneo es aquel que no debe esperar a que
lleguen más códigos para identificarlo (es inconfundible).
00, 01,11
– Código no instantáneo es aquel que requiere de identificar
al código siguiente, o parte de aquél, para reconocerlo.
0, 01, 11 00111
FIUBA Organización de Datos - Curso Servetto 14
Representación de los Datos
(códigos de representación).
● Códigos Prefijos
– Son aquellos en donde un código no puede conformar el
comienzo de otro. ● No Prefijo A = 010111 C = 1000 B = 0100 D = 10 ● Prefijo A = 001111 C = 010 B = 0001 D = 10
– Los códigos prefijos son instantáneos.
FIUBA Organización de Datos - Curso Servetto 15
Representación de los Datos
(códigos de representación).
● Redundancia en la representación: – Códigos Tipo A: A = 00001 E = 00010 I = 00100 O = 01000 U = 10000 – Códigos Tipo B: A = 001 E = 011 I = 100 O = 101 U = 110FIUBA Organización de Datos - Curso Servetto 16
Referencias
● David Salomon , “A Concise Introduction to Data
Compression ”, Springer-Verlag London Limited 2008 , pp 21-29.
FIUBA Organización de Datos - Curso Servetto 17
Algoritmos de Codificación
● Son algoritmos para modificar la representación
de una fuente.
● La representación resultante es sin pérdida de
información.
● Generan códigos prefijos.
● Para permitir la descompresión pueden necesitar
FIUBA Organización de Datos - Curso Servetto 18
Algoritmos de Codificación
● Clasificación según la forma de reconocer la
redundancia
● Estadístico
– Los códigos aproximan a la representación del teorema de
Shanon
● Run-Length
● Por Diccionario
– Los códigos se generan en base a la repetición de
FIUBA
Organización de Datos - Curso Servetto
19
Algoritmos de
Codificación(Cont.)
● Clasificación según la forma de reconocer la
redundancia
● Predictor
– Lleva un registro de lo ya procesado y aplica un algoritmo
para predecir (puede acertar o no) los que vendrán.
– Pueden utilizar la técnica de múltiples contextos: que utiliza
la probabilidad condicional, modificando la fórmula de Shanon, y aumenta las probabilidades de aparición, generando códigos más cortos (comprimiendo más).
● Híbrido
– Combina algoritmos de diferentes características
FIUBA Organización de Datos - Curso Servetto 20
Algoritmos de Codificación
● Clasificación según la forma de procesar los datos
● Estático
– Genera una sola vez los códigos y se producen reemplazos
idénticos en todo el proceso de compresión.
– En general necesita procesar dos veces a toda la fuente (o
archivo) para definir los códigos.
– Los códigos generados son los más cortos que el algoritmo
FIUBA Organización de Datos - Curso Servetto 21
Algoritmos de
Codificación(Cont.)
● Clasificación según la forma de procesar los datos
● Dinámico
– Los códigos se generan en base a un supuesto inicial que se
va modificando a medida que avanza la compresión.
– Genera códigos distintos y se producen reemplazos
diferentes dureante el proceso de compresión.
– Los códigos generados, en general, mejoran con el avance
FIUBA
Organización de Datos - Curso Servetto
22
Formas de Finalizar un Archivo
comprimido
● Conteo de Emisiones
● Se guarda un valor, que se lee al principio, para
identificar la cantidad de códigos generados. Entonces se procesa realizando una cuenta regresiva, cuando llega a cero se finaliza.
● Relleno de bits(Padding)
● Se completan los bits faltantes para que el archivo
tenga longitud entera de bytes (si ya la tiene se le agrega un byte maś) con ceros (“0”) y un uno (“1”). (Con algunos compresores no tiene sentido esta técnica) . Ejemplo: 01010101 01011000
FIUBA Organización de Datos - Curso Servetto 23
Formas de Finalizar un Archivo
comprimido(Cont.)
● Mensaje Especial
● Se agrega un caracter especial en el diccionario,
cuya aparición significa el fin del archivo. Entonces cuando se termina el archivo original se realizar una compresión más, como si apareciese ese caracter.
FIUBA Organización de Datos - Curso Servetto 24
Algoritmos de
Compresión Sin
Pérdida
(Lossless)
Estadísticos Por Diccionario Predictores HíbridosFIUBA Organización de Datos - Curso Servetto 25
Algoritmos de
Compresión
Estadísticos
Algoritmo de Huffman Algoritmo AritméticoFIUBA Organización de Datos - Curso Servetto 26
Algoritmo de Huffman
(Estadístico)
FIUBA
Organización de Datos - Curso Servetto 27
Algoritmo de Huffman
(Estadístico)
● Árbol de generación de códigos.
● Genera Códigos Prefijos de longitud variable.
● Esos códigos aproximan a las longitudes calculadas
por el Teorema de Shannon en bits enteros y no existe arbol capaz de generar codigos con emision de bits enteras mejores que Huffman.
● Utiliza un árbol para generar los códigos.
● En las hojas del árbol están los caracteres posibles
de comprimir.
● El camino desde la raiz hacia las hojas define el
FIUBA Organización de Datos - Curso Servetto 28
Algoritmo de Huffman
(Estadístico)
●Árboles de Huffman
●Se generan en función de las veces que aparece un
caracter en el archivo (frecuencia); cuanto más aparece, más cerca de la raíz está y códigos más cortos de
reemplazo tiene.
FIUBA Organización de Datos - Curso Servetto 29
Algoritmo de Huffman
(Estadístico)
●Las codificaciones de los símbolos son:
–A: 000 B: 001 C: 01 D: 1
●Como se basa en la frecuencia solamente es un
FIUBA Organización de Datos - Curso Servetto 30
Algoritmo de Huffman
(Estadístico)
●Construcción paso a paso fuente JERRYRICE:
●Se utiliza una lista con par(simbolo,frecuencia), ordenada por
frecuencia.
●Se unen los nodos con menor frecuencia, para generar el nodo
padre.
●El nodo padre que se cree en cada paso, tendra como hijo
izquierdo al primero de la lista y derecho al segundo.
●En caso de haber un nodo de igual frecuencia al agregar, se
agrega al final de esa repeticion de frecuencias(mejorar la longitud de los codigos)
FIUBA Organización de Datos - Curso Servetto 31
Algoritmo de Huffman
(Estadístico)
●Construcción paso a paso fuente JERRYRICE:
● Se obtienen las frecuencias de cada símbolo.
● 1) Se genera un nodo con C e I como hijos(frecuencia 2, por lo que van a continuacion de la E). ● 2) Se genera un nodo con J e Y como hijos(frecuencia 2, por lo que van a continuacion de la C-I).
● 3) Se genera un nodo con E y C-I como hijos(frecuencia 3, por lo que van a continuacion de la R). Si hubiesemos
puesto en primer lugar a C-I y J-Y en la tabla(antes que la E), hubiesemos tenido al momento de armar un nodo padre 4 simbolos a una distancia 2 del mismo padre(codigos mas largos).
● 4) Se genera un nodo con J-Y y R.
FIUBA Organización de Datos - Curso Servetto 32
Algoritmo de Huffman
(Método estático)
Arbol final para la fuente JERRYRICE
Codificación: C=010, E=00, I=011, J=100, R=11, Y=101 Representación final: 100-00-11-11-101-11-011-010-00
●22 bits de longitud contra 21.74 dados por la entropía ●Notar que la cantidad de bits es entera!!!
FIUBA Organización de Datos - Curso Servetto 33
Algoritmo de Huffman
(método estático)
● La emisión debe incluir la tabla de frecuencias,
debido que es necesaria para la descompresión.
● Tabla: C = 1, E = 2, I = 1, J = 1, R = 3, Y = 1
FIUBA Organización de Datos - Curso Servetto 34
Algoritmo de Huffman
(método estático)
●En primer lugar cabe aclarar que el descompresor
debe armar EL MISMO árbol que el compresor. Para esto se siguen los siguientes pasos:
● El descompresor lee la tabla de frecuencias,
generando el mismo árbol(pensar que el algoritmo es el mismo)
●Finalmente lo que se hace, con el arbol armado,
es leer bit a bit el archivo que tenemos y emitir cuando lleguemos a un nodo hoja.
FIUBA Organización de Datos - Curso Servetto 35
Algoritmo de Huffman
(método estático)
Descompresión de la fuente JERRYRICE
● Se lee la tabla de frecuencias y se arma el mismo
árbol final(0 a izq, 1 a derecha ):
● Se lee bit a bit y se mueve sobre las ramas del
árbol emitiendose cuando se llega a un hoja obteniendose la siguiente tabla:
FIUBA Organización de Datos - Curso Servetto 36
Algoritmo de Huffman
(método estático)
Descompresión de la fuente JERRYRICE(Cont.)
Paso 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
Bit Leido 1 0 0 0 0 1 1 1 1 1 0 1 1 1 0 1 1 0 1 0 0 0
Mov. En Arbol Der. Izq Izq. Izq Izq. Der. Der. Der. Der. Der. Izq Der. Der. Der. Izq Der. Der. Izq Der. Izq. Izq Izq.
T.Nodo Int. Int. Hoj. Int. Hoj. Int. Hoj. Int. Hoj. Int. Int. Hoj. Int. Hoj. Int. Int. Hoj. Int. Int. Hoj. Int. Hoj.
FIUBA Organización de Datos - Curso Servetto 37
Algoritmo de Huffman
(método dinámico)
●Todas las frecuencias se asumen
inicialmente iguales a 1
●Se construye el árbol completo en cada
paso para la tabla de frecuencias actual
●En la siguiente diapositiva se muestra el
árbol final antes de cada emisión, no la construcción paso a paso.
FIUBA Organización de Datos - Curso Servetto 38
Algoritmo de Huffman
(método dinámico)
Emisión: 111-101-110-01-110-10-011-010-101 25 bits (3 más que el estático)
FIUBA Organización de Datos - Curso Servetto 39
Algoritmo de Huffman
(método dinámico)
●La emisión no incluye la tabla de
frecuencias
●El compresor y el descompresor conocen
implícitamente el alfabeto (por ejemplo, los bytes del 0 a 255), no hace falta
transmitirlo
●Para emitir bytes completos, se usan las
mismas técnicas vistas para finalizar archivos
FIUBA Organización de Datos - Curso Servetto 40
Algoritmo de Huffman
(método dinámico)
● Descompresión:
● Sigue la misma idea que el estático, salvo que la
tabla de frecuencias arrancan para todos los caracteres en 1.
● Se lee el archivo bit a bit, moviéndonos en el árbol
hasta llegar a un nodo hoja. Es en este momento donde emitimos el carácter correspondiente.
● A diferencia del anterior, debemos incrementar la
frecuencia de dicho carácter(siempre siguiendo la misma lógica que en el compresor)
FIUBA Organización de Datos - Curso Servetto 41
Algoritmo de Huffman
(método dinámico)(Cont.)
● Tabla Ejemplo Descompresión JERRYRICE:
Paso 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Bit Leido 1 1 1 1 0 1 1 1 0 0 1 1 1 0 1 0 0 1 1 0 1 0 1 0 1 Mov. En Arbol Izq. Izq. Izq. Izq. Der. Izq. Izq. Izq. Der. Der. Izq. Izq. Izq. Der. Izq. Der. Der. Izq. Izq. Der. Izq. Der. Izq. Der. Izq. T.Nodo Int. Int. Hoj. Int. Int. Hoj. Int. Int. Hoj. Int. Hoj. Int. Int. Hoj. Int. Hoj. Int. Int. Hoj. Int. Int. Hoj. Int. Int. Hoj.
Emisión ---- ---- J ---- ---- E ---- ---- R ---- R ---- ---- Y ---- R ---- ---- I ---- ---- C ---- ---- E Actualización
FIUBA Organización de Datos - Curso Servetto 42
Algoritmo de Huffman
(método dinámico)
● Descompresión(Cont.):
● Arboles finales generados en cada paso de la
FIUBA Organización de Datos - Curso Servetto 43
Algoritmo de Huffman
Manejo Eficiente
(método dinámico)
●Logra una actualización rápida del árbol
de un paso al otro
●No cambia el nivel de compresión
●Los nodos tienen 2 hijos o ninguno
●Para tener un árbol óptimo alcanza con
que:
Si P(A) > P(B) entonces L(A) ≤ L(B) Si P(A) = P(B) entonces |L(A)-L(B)| ≤ 1 Regla de oro: Si #A > #B => F(A) ≤ F (B)
FIUBA Organización de Datos - Curso Servetto 44
Algoritmo de Huffman
Manejo Eficiente
(método dinámico)
●Se numeran (#) los nodos en forma
ascendiente, de la raíz hacia abajo y de derecha a izquierda, y se escribe la
FIUBA Organización de Datos - Curso Servetto 45
Huffman dinámico:
manejo eficiente
●Si aumenta en 1 la frecuencia de la Y, la
estructura del árbol no necesita cambiar
porque la frecuencia aumenta de izq a der, de abajo a arriba:
FIUBA Organización de Datos - Curso Servetto 46
Algoritmo de Huffman
Manejo Eficiente
(método dinámico)
●Si en vez de eso aumenta en 1 la
frecuencia de la E, la estructura del árbol cambia: se intercambia el nodo de la E
(nodo 10) y el nodo de menor numeración con frecuencia superior (nodo 7):
FIUBA Organización de Datos - Curso Servetto 47
Algoritmo de Huffman
Manejo Eficiente
(método dinámico)
●Caso particular: al aumentar la frecuencia
de C en este árbol(hoja- no hoja)
El nodo candidato para el intercambio es el 3. Se realiza el intercambio y el árbol queda..
FIUBA
Organización de Datos - Curso Servetto
48
Algoritmo de Huffman
Manejo Eficiente
(método dinámico)
●Notar que se intercambio el sub-árbol
entero del nodo 3.
●Este árbol sigue siendo un árbol de
Huffman ya que cumple con todas las propiedades
FIUBA Organización de Datos - Curso Servetto 49
Algoritmo de Huffman
Manejo Eficiente
(método dinámico)
● Ejemplo de compresión(fte: porotosEOF)
FIUBA Organización de Datos - Curso Servetto 50
Algoritmo de Huffman
Manejo Eficiente
(método dinámico)
● Ejemplo de compresión(fte: porotosEOF)
1) Arbol Inicial 2)Lectura p(Emisión 10)
FIUBA Organización de Datos - Curso Servetto 51
Algoritmo de Huffman
Manejo Eficiente
(método dinámico)
● Ejemplo de compresión(fte: porotosEOF)
5) Lectura o(Emision 11) 6)Lectura t(Emisión 001)
FIUBA Organización de Datos - Curso Servetto 52
Algoritmo de Huffman
Manejo Eficiente
(método dinámico)
● Ejemplo de compresión(fte: porotosEOF)
9) Lectura EOF(Emision 101)
● Notar que se emite con el arbol de la figura anterior a la lectura. ● En el ultimo paso no es neceseario actualizar el arbol.
FIUBA Organización de Datos - Curso Servetto 53
Algoritmo de Huffman
Manejo Eficiente
(método dinámico)
● Ejemplo de descompresión(fte: porotosEOF)
FIUBA Organización de Datos - Curso Servetto 54
Algoritmo de Huffman
Manejo Eficiente
(método dinámico)
● Ejemplo de descompresión(fte: porotosEOF)
● El método es similar a la descompresión explicada anteriormente.
● 1) Se lee bit 1, luego bit 0 -> se emite p-> se actualiza el arbol.
FIUBA Organización de Datos - Curso Servetto 55
Algoritmo de Huffman
Manejo Eficiente
(método dinámico)
● Ejemplo de descompresión(fte: porotosEOF)
● El método es similar a la descompresión explicada anteriormente.
● 3) Se lee bit 0, luego bit 1 y bit 1 -> se emite r-> se actualiza el arbol.
FIUBA Organización de Datos - Curso Servetto 56
Algoritmo de Huffman
Manejo Eficiente
(método dinámico)
● Ejemplo de descompresión(fte: porotosEOF)
● El método es similar a la descompresión explicada anteriormente.
● 5) Se lee bit 0, luego bit 0 y bit 1 -> se emite t-> se actualiza el arbol.
FIUBA Organización de Datos - Curso Servetto 57
Algoritmo de Huffman
Manejo Eficiente
(método dinámico)
● Ejemplo de descompresión(fte: porotosEOF)
● El método es similar a la descompresión explicada anteriormente.
● 7) Se lee bit 1, luego bit 1 y bit 0 -> se emite s-> se actualiza el arbol.
FIUBA Organización de Datos - Curso Servetto 58
Referencias
● D.A. Huffman, "A Method for the Construction of
Minimum-Redundancy Codes", Proceedings of the I.R.E., September 1952, pp 1098–1102.
FIUBA Organización de Datos - Curso Servetto 59
Algoritmo de Aritmético
(Estadístico)
FIUBA Organización de Datos - Curso Servetto 60
Algoritmo Aritmético
(Estadístico)
●Segmento de generación de códigos.
●Genera un único código, que representa a todo el archivo, longitud
variable.
●Ese código aproxima a las longitudes calculadas por el Teorema
de Shannon en fracciones bits.
●No asigna a cada símbolo un código en bits de longitud entera. Se
puede decir que cada símbolo está representado por un código de longitud no entera de bits, formando parte del código único.
FIUBA Organización de Datos - Curso Servetto 61
Algoritmo Aritmético
(Estadístico)
●Segmento de generación de códigos(Cont.)
●Utiliza un segmento dividido en función de las probabilidades de
los caracteres a considerar para generar las emisiones.
●El camino de decisiones tomadas, segmento a segmento, genera
emisiones de números binarios que se concatenan y dan como resultado el archivo comprimido.
●Conceptualmente codifica el archivo entero como un número real
FIUBA Organización de Datos - Curso Servetto 62
Algoritmo Aritmético
(Estadístico)
●Segmento Aritmético
● Ej: AAABBCC
● Se divide el intervalo de “0 a 1” según la probabilidad de los símbolos (se
adapta al intervalo con el que se está comprimiento. Ej: 0 – 255)
●En cada paso se elige un subintervalo según el símbolo leído
●En el siguiente paso se divide el subintervalo elegido de la misma forma ●Se repite hasta llegar al último carácter
FIUBA Organización de Datos - Curso Servetto 63
Algoritmo Aritmético
(Estadístico)
●Soluciones técnicas para las limitaciones del
hardware (Overflow y Underflow):
●Las computadoras no trabajan nativamente con números reales de
precisión arbitraria.
●En vez de utilizar un intervalo real para trabajar, se elige un
intervalo entero de 0 a 2N. Los números de ese intervalo tendrán N
FIUBA
Organización de Datos - Curso Servetto
64
Algoritmo Aritmético
(Estadístico)
●División de un intervalo:
●Se divide el intervalo [Piso1,
TechoN] en N subintervalos de
diversas longitudes
●Sea L = TechoN - Piso1 + 1
●Techoi = floor(Pisoi + P(si).L) - 1 ●Pisoi+1 = Techoi + 1
●En el siguiente paso, el
subintervalo elegido es el que se subdivide
FIUBA Organización de Datos - Curso Servetto 65
Algoritmo Aritmético
(Estadístico)
●Overflow:
●Situación en la que se permite dejar
de considerar el bit más significativo de los límites del intervalo, dado que ese valor pertenece con seguridad al código final generado.
1101
1000
Emito el '1' y completo.
1011
FIUBA Organización de Datos - Curso Servetto 66
Algoritmo Aritmético
(Estadístico)
●Underflow:
●Situación en la que se pierde
presición porque en el proceso de compresión se llegó a una situación donde la diferencia entre el techo y el piso es inferior a la unidad del bit más significativo y de su siguiente, por lo que solo podrán cambiar los restantes en los pasos que continúan. Esto
puede llevar a que se congelen más bits, al punto de no poder avanzar por tener congelados a todos.
1010
0110
Sumo '1' al contador De Underflow,
Quito el segundo Bit y completo.
1101
0100 UF=1 UF=0
FIUBA Organización de Datos - Curso Servetto 67
Algoritmo Aritmético
(Estadístico)
●Es posible que tras normalizar un overflow,
se descubra un underflow
Techo: 11011001 11100111
FIUBA Organización de Datos - Curso Servetto 68
Algoritmo Aritmético
(Estadístico)
●Al detectar un overflow y realizar la emisión, se emiten
tras el primer dígito tantos dígitos negados como sea el contador de underflow y se pone el contador en 0
(U=2)
Techo: 11101101 11101111
Piso: 11010110 00110000
FIUBA Organización de Datos - Curso Servetto 69
Algoritmo Aritmético
(Estadístico)
●Cuanto más chico es el intervalo, más precisión hace
falta para representarlo.
●Cuanto más probable es un símbolo, más grande su
intervalo y menos bits se emiten cuando ocurre.
●El método estático emite (guarda) la tabla de
frecuencias y requiere dos pasadas.
●El método dinámico no guarda la tabla de frecuencias,
FIUBA Organización de Datos - Curso Servetto 70
Algoritmo Aritmético
(método estático)
●Se genera la tabla de frecuencias con la primer
pasada.
●Se divide el intervalo de "0 a 1" según la probabilidad
dada por la tabla de frecuencias (que es estática).
●En cada paso se elige un subintervalo según el símbolo
leído.
FIUBA Organización de Datos - Curso Servetto 71
Algoritmo Aritmético
(método estático)
●Finalmente se emite un número del subintervalo
elegido en el último paso (por convención, el piso)
●El código resultante es el mejor que puede generar
este compresor.
●Define el fin de archivo con la suma de frecuencias de
FIUBA Organización de Datos - Curso Servetto 72
Algoritmo Aritmético
(método estático)
● Compresión de BAABCA:
●Compresión del caracter 'B' - (Posicion: 0)
Piso inicial: 0 - Techo Inicial 255 Intervalo: 256
N.Piso = 0 + 256 * 3 / 6 = 128 N. Techo = 0 + 256 * 5 / 6 - 1 = 212
Resultado de la normalización:
Piso: 10000000 (128) -> 00000000 (0) Techo: 11010100 (212) -> 10101001 (169) Emisión: 1 C. underflow: 0
●Compresión del caracter ‘A' - (Posicion: 1)
Piso inicial: 0 - Techo Inicial 169 Intervalo: 170
N.Piso = 0 + 170 * 0 / 6 = 0 N. Techo = 0 + 170 * 3 / 6 - 1 = 84
Resultado de la normalización:
Piso 00000000 (0) -> 00000000 (0) Techo: 01010100 (84) -> 10101001 (169) Emisión: 0 C. underflow: 0
FIUBA Organización de Datos - Curso Servetto 73
Algoritmo Aritmético
(método estático)
● Compresión de BAABCA:
●Compresión del caracter ‘A' - (Posicion: 2)
Piso inicial: 0 - Techo Inicial 169 Intervalo: 170
N.Piso = 0 + 170 * 0 / 6 = 0 N. Techo = 0 + 170 * 3 / 6 - 1 = 84
Resultado de la normalización:
Piso: 00000000 (0) -> 00000000 (0) Techo: 01010100 (84) -> 10101001 (169) Emisión: 0 C. underflow: 0
●Compresión del caracter ‘B' - (Posicion: 3)
Piso inicial: 0 - Techo Inicial 169 Intervalo: 170
N.Piso = 0 + 170 * 3 / 6 = 85 N. Techo = 0 + 170 * 5 / 6 - 1 = 140
Resultado de la normalización:
Piso: 01010101 (85) -> 00101010 (42) Techo: 10001100 (140) -> 10011001 (153) Emisión: C. underflow: 1
FIUBA Organización de Datos - Curso Servetto 74
Algoritmo Aritmético
(método estático)
● Compresión de BAABCA:
●Compresión del caracter ‘C' - (Posicion: 4)
Piso inicial: 42 - Techo Inicial 153 Intervalo: 112
N.Piso = 42 + 112 * 5 / 6 = 135 N. Techo = 42 + 112 * 6 / 6 - 1 = 153
Resultado de la normalización:
Piso: 10000111 (135) -> 00111000 (56) Techo: 10011001 (153) -> 11001111 (207) Emisión: 1000(Underflow) C. underflow: 0
●Compresión del caracter ‘A' - (Posicion: 5)
Piso inicial: 56 - Techo Inicial 207 Intervalo: 152
N.Piso = 56 + 152 * 0 / 6 = 56 N. Techo = 56 + 152 * 3 / 6 - 1 = 131
Al ser el ultimo caracter, se emite el piso, incluyendo los underflows: Piso: 00111000 (56) --- > Emisión: 00111000
FIUBA Organización de Datos - Curso Servetto 75
Algoritmo Aritmético
(método estático)
● Descompresión de BAABCA:
●Archivo comprimido: 100100000111000
●Se leen la tablas de frecuencias(que están en el mismo
archivo):
●A= 3, B=2, C=1
●Se plantea el intervalo inicial y se leen de a N bits(N
FIUBA Organización de Datos - Curso Servetto 76
Algoritmo Aritmético
(método estático)
● Descompresión de BAABCA:
●Descompresión del caracter 'B‘ ●Rangos iniciales:
●C = [213 - 255] = [11010101 - 11111111]; B = [128 - 212] = [10000000 - 11010100] ; A = [000 - 127] = [00000000 - 01111111] ●Se leen 8 bits: 10010000 -> Cae en el rango de la B(128-212)
●Se emite una B.
●Descompresión del caracter ‘A'
Se plantea el nuevo intervalo(128-212)(Overflow de 1)
Resultado de la normalización(Overflow de 1):
Piso: 10000000 (128) -> 00000000 (0) Techo: 11010100 (212) -> 10101001 (169)
Nuevos Intervalos:
C [141 - 169] = [10001101 - 10101001] ; B [085 - 140] = [01010101 - 10001100] ; A [000 - 084] = [00000000 - 01010100] Debido al overflow, descartamos el 1er bit leído anteriormente y leemos uno mas del archivo: 100100000
00100000 -> Cae en el rango de la A
FIUBA Organización de Datos - Curso Servetto 77
Algoritmo Aritmético
(método estático)
● Descompresión de BAABCA:
●Descompresión del caracter ‘A‘
Se plantea el nuevo intervalo(0-84)(Overflow de 1)
Resultado de la normalización(Overflow de 1):
Piso 00000000 (0) -> 00000000 (0) Techo: 01010100 (84) -> 10101001 (169)
C [141 - 169] = [10001101 a 10101001] ; B [085 - 140] = [01010101 - 10001100] ; A [000 - 084] = [00000000 - 01010100] Debido al overflow, descartamos el 1er bit leído anteriormente y leemos uno mas del archivo: 1001000001
01000001 -> Cae en el rango de la A
Se emite una A.
●Descompresión del caracter ‘B‘
Se plantea el nuevo intervalo(0-84)(Overflow de 1)
Resultado de la normalización(Overflow de 1):
Piso 00000000 (0) -> 00000000 (0) Techo: 01010100 (84) -> 10101001 (169)
Nuevos Intervalos:
C [141 - 169] = [10001101 - 10101001] ; B [085 - 140] = [01010101 - 10001100] ; A [000 - 084] = [00000000 - 01010100] Debido al overflow, descartamos el 1er bit leído anteriormente y leemos uno mas del archivo: 10010000011
01000001 -> Cae en el rango de la B
FIUBA Organización de Datos - Curso Servetto 78
Algoritmo Aritmético
(método estático)
● Descompresión de BAABCA:
●Descompresión del caracter ‘C‘
Se plantea el nuevo intervalo(85-140)(Underflow -> Cont. UF=1)
Resultado de la normalización(Underflow de 1):
Piso: 01010101 (85) -> 00101010 (42) Techo: 10001100 (140) -> 10011001 (153)
Nuevos Intervalos:
C [135 - 153] = [10000111 - 10011001] ; B [098 - 134] = [01100010 - 10000110] ; A [042 - 097] = [00101010 - 01100001]
Debido al Underflow, dejamos fijo el 1er bit en inspección y luego descartar tantos bits como underflows tengamos(1 bit en este caso, 0), completar del archivo leyendo los bits necesarios para 1 byte : 1001(Fijo)0(Descartado)0000111(leído)
10000111 -> Cae en el rango de la C
Se emite una C.
●Descompresión del caracter ‘A‘
Se plantea el nuevo intervalo(135-153)(Overflow de 3)
Resultado de la normalización(Overflow de 3):
Piso: 10000111 (135) -> 00111000 (56) Techo: 10011001 (153) -> 11001111 (207)
Nuevos Intervalos:
C [182 - 207] = [10110110 - 11001111] ; B [132 - 181] = [10000100 - 10110101] ; A [056 - 131] = [00111000 - 10000011]
Debido al overflow, descartamos los 3 1eros bits leídos anteriormente y leemos 3 mas del archivo: 1001(O)000(O)00111000(Leidos) 00111000 -> Cae en el rango de la A
FIUBA Organización de Datos - Curso Servetto 79
Algoritmo Aritmético
(método dinámico)
●Se asigna frecuencia 1 a todos los símbolos
●Se divide el intervalo de "0 a 1" según la probabilidad
dada por la tabla de frecuencias
●En cada paso se elige un subintervalo según el símbolo
leído. Luego se modifica la tabla de frecuencias
●En el siguiente paso se divide el subintervalo elegido
según la nueva tabla
FIUBA Organización de Datos - Curso Servetto 80
Algoritmo Aritmético
(método dinámico)
●Finalmente se emite un número del subintervalo
elegido en el último paso
●Las probabilidades se van modificando, adecuando, a
medida que se avanza en la compresión.
●El código resultante es igual o peor que el generado
por el estático (pero no necesita tabla de frecuencias).
●El fin de archivo, generalmente, se define con un
caracter especial (EOF). También se pueden indicar la cantidad de emisiones al principio del archivo.
FIUBA Organización de Datos - Curso Servetto 81
Algoritmo Aritmético
(Dinamico)
● Compresión de ABAC:
●Compresión del caracter ‘A' - (Posicion: 0) A=1, B=1, C=1 A=2, B=1, C=1
Piso inicial: 0 - Techo Inicial 255 Intervalo: 256
N.Piso = 0 + 256 * 0 = 0 N. Techo = 0 + 256 * 1 / 3 - 1 = 84
Resultado de la normalización:
Piso: 00000000 (0) -> 00000000 (0) Techo: 01010100 (84) -> 10101001 (169) Emisión: 0 C. underflow: 0
●Compresión del caracter ‘B' - (Posicion: 1) A=2, B=1, C=1 A=2, B=2, C=1
Piso inicial: 0 - Techo Inicial 169 Intervalo: 170
N.Piso = 0 + 170 * 2 / 4 = 85 N. Techo = 0 + 170 * 3 / 4 - 1 = 126
Resultado de la normalización:
Piso 01010101 (85) -> 01111110 (126) Techo: 01010100 (84) -> 11111011 (251) Emisión: 01 C. underflow: 0
FIUBA Organización de Datos - Curso Servetto 82
Algoritmo Aritmético
(Dinamico)
● Compresión de ABAC :
●Compresión del caracter ‘A' - (Posicion: 2) A=2, B=2, C=1 A=3, B=2, C=1
Piso inicial: 84 - Techo Inicial 251 Intervalo: 168
N.Piso = 84 + 168 * 0 / 5 = 84 N. Techo = 84 + 168 * 2 / 5 - 1 = 150
Resultado de la normalización:
Piso: 01010100 (84) -> 00101000 (40) Techo: 10010110 (150) -> 10101101 (173) Emisión: - C. underflow: 1
●Compresión del caracter ‘C' - (Posicion: 3) A=3, B=2, C=1 A=3, B=2, C=2
Piso inicial: 40 - Techo Inicial 173 Intervalo: 134
N.Piso = 40 + 134 * 5 / 6 = 151 N. Techo = 40 + 134 * 6 / 6 - 1 = 173
Al ser el ultimo caracter, se emite el piso, incluyendo los underflows: Piso: 10010111 (151) --- > Emisión: 100010111
FIUBA Organización de Datos - Curso Servetto 83
Algoritmo Aritmético
(Dinamico)
● Descompresión de ABAC:
●Descompresión del caracter ‘A‘ A=1, B=1, C=1 A=2, B=1, C=1 ●Rangos iniciales:
●C = [170 - 255] = [10101010 - 11111111]; B = [85 - 169] = [001010101 - 10101001] ; A = [0 - 84] = [00000000 - 001010100] ●Se leen 8 bits: 00110001 (25) -> Cae en el rango de la A(0-84)
●Se emite una A.
●Descompresión del caracter ‘B‘ A=2, B=1, C=1 A=2, B=2, C=1
Se plantea el nuevo intervalo(0-84)(Overflow de 0)
Resultado de la normalización(Overflow de 0):
Piso: 00000000 (0) -> 00000000 (0) Techo: 01010100 (84) -> 10101001 (169)
Nuevos Intervalos:
C [127 - 169] = [01111111 - 10101001] ; B [85 - 126] = [01010101 - 01111110] ; A [0 - 84] = [00000000 - 01010100] Debido al overflow, descartamos el 1er bit leído anteriormente y leemos uno mas del archivo: 001100010 01100010 (98) -> Cae en el rango de la B
FIUBA Organización de Datos - Curso Servetto 84
Algoritmo Aritmético
(Dinamico)
● Descompresión de ABAC:
●Descompresión del caracter ‘A‘ A=2, B=2, C=1 A=3, B=2, C=1
Se plantea el nuevo intervalo(85-126)(Overflow de 01)
Resultado de la normalización(Overflow de 01):
Piso 01010101 (85) -> 01010100 (84) Techo: 01111110 (126) -> 11111011 (251) C [218 - 251]; B [151 - 217]; A [84 - 150]
Debido al overflow, descartamos los dos primeros bits leídos anteriormente y leemos dos mas del archivo: 00110001011(leídos) 10001011 (139) -> Cae en el rango de la A
Se emite una A.
●Descompresión del caracter ‘C‘ A=3, B=2, C=1 A=3, B=2, C=2
Se plantea el nuevo intervalo(84-150)(Underflow de 1)
Resultado de la normalización(Underflow de 1):
Piso 01010100 (84) -> 00101000 (40) Techo: 10010110 (150) -> 10101101 (173)
Nuevos Intervalos:
C [151 – 173] ; B [107 - 150] ; A [40 - 106]
Debido al Underflow, dejamos fijo el 1er bit en inspección y luego descartar tantos bits como underflows tengamos(1 bit en este caso, 0), completar del archivo leyendo los bits necesarios para 1 byte : 0011(Fijo)0(Descartado)0010111(leídos)
10010111 (151) -> Cae en el rango (es el piso) de la C
FIUBA Organización de Datos - Curso Servetto 85
Referencias
● Witten, Ian H.; Neal, Radford M.; Cleary, John G.
(June 1987). "Arithmetic Coding for Data
Compression" (PDF). Communications of the ACM 30 (6): 520–540. Retrieved 2007-09-21.
FIUBA Organización de Datos - Curso Servetto 86
Algoritmos de
Compresión No
estadística
Algoritmo Lz77 Algoritmo Lz78/WFIUBA Organización de Datos - Curso Servetto 87
Algoritmos de Compresión
Run Length
● Detecta repeticiones de símbolos y las reemplaza
por pares (símbolo,longitud)
● Funciona bien cuando hay secuencias de
símbolos que se repiten mucho
● Se suelen implementar como parte de algoritmos
FIUBA Organización de Datos - Curso Servetto 88
Algoritmos de Compresión
Run Length
Ejemplos:
● Notar que aumenta el tamaño si no se repiten los
caracteres ABCABCABC 1A1B1C1A1B1C1A1B1C AAABBBCCC 3A3B3C Estadístico: Mal
Run length.: Mal
Estadístico: Igual de mal
FIUBA Organización de Datos - Curso Servetto 89
Algoritmos de Compresión por
Diccionario
● Consisten en sustituir una cadena de varios
símbolos por un puntero a la entrada en un
diccionario, el cual puede ser estático o adaptable (dinámico)
● Un mismo símbolo no siempre se sustituye con lo
mismo (≠ codificación)
“Esto es una clase de
organización de datos. Cátedra servetto”
233/4 219/5 579/2 121/9 182/1 393/7 182/1 180/1 99/15
FIUBA Organización de Datos - Curso Servetto 90
Algoritmo Lz77
(por Diccionario)
● Abraham Lempel y Jacob Ziv en 1977
● Es la base del formato gráfico PNG(B&N)
● El diccionario es la ventana de memoria
(adaptativo) Ventana de Inspección (Lookahead Window) Tamaño N Ventana de Memoria (Memory Window) Tamaño M
Logitud Mínima de Match (A)
FIUBA Organización de Datos - Curso Servetto 91
Algoritmo Lz77
(por Diccionario)
● Siempre nos quedamos con el acierto más grande y en caso de haber un
acierto de la misma longitud, nos quedamos con el de menor posición.
● Un bit más para distinguir la codificación de un par ordenado de un carácter. ● Para codificar posiciones y longitudes:
● P posiciones posibles (0,..,P): K bits -> K = Techo(Log2 (M – A + 1)) ● L longitudes posibles (A,…,L): K2 bits ->K2 = Techo(Log2 (Min(M,N)–
A+1))
FIUBA Organización de Datos - Curso Servetto 92
Algoritmo Lz77
(por Diccionario)
● Método de Compresión :
● Inicialmente se toma la ventana de memoria como vacía (con algún caracter especial para indicar ello por
ejemplo) y se carga la ventana de inspección con los primeros N caracteres del archivo
● Mientras sigan quedando caracteres en la ventana de inspección (mientras no se haya llegado al fin del archivo)
se compara el string que comienza en la posición 0 de dicha ventana con todos los strings que comienzan en cada posición de la ventana de memoria.
● Si no hay ningún match de longitud mayor a la mínima, entonces se emite el primer caracter de la ventana de inspección
y ambas ventanas se desplazan 1 caracter (la ventana de memoria pierde su primer caracter y el ultimo pasa a ser el caracter recientemente comprimido; la ventana de inspección también pierde su primer caracter y lee del archivo a comprimir el siguiente caracter, que ubica al final)
• Si hay al menos un match de longitud mayor a la mínima, se toma el match de mayor longitud (puede haber varios
matchs) y se emite primero la posición en la que se dio el match en la ventana de memoria y luego la longitud del mismo. Las dos ventanas se desplazan tantos caracteres como sea la longitud de dicho match (la de memoria pierde sus primeros k caracteres y los k últimos pasan a ser el substring que matcheo, la de inspección también pierde sus primeros k caracteres y lee otros k del archivo que los ubica al final). En caso de empate entre 2 matchs con la longitud máxima se debe tomar alguna convención, por ejemplo emitir la de menor posición
FIUBA Organización de Datos - Curso Servetto 93
Algoritmo Lz77
(por Diccionario)
● Ejemplo de Compresión fuente
RAPATAPATAPARAPAPA :
● Tamaño Ventana de Memoria = 6
● Tamaño Ventana de Inspección= 5
● Tamaño mínimo match = 2
● Longitudes posibles= L2,L3,L4,L5
● Techo(Log2 (Min(M,N)–A+1)) = Techo(log2(4))=2bits ● Posiciones posibles= 0,1,2,3,4(P5 no se puede dar)
● Techo(Log2 (M – A + 1))= Techo(log2(5))=3 bits
● Par (posicion,longitud) = 6 bits y carácter 9 bits.
FIUBA Organización de Datos - Curso Servetto 94
Algoritmo Lz77
(por Diccionario)
● Ejemplo de Compresión fuente
RAPATAPATAPARAPAPA :
Ventana de Memoria(6) Ventana de Inspeccion(5) Salida del Compresor Ubicaciones de las ventanas en file
--- RAPAT R |RAPAT|APATAPARAPAPA
---R APATA A |R|APATA|PATAPARAPAPA
----RA PATAP P |RA|PATAP|ATAPARAPAPA
---RAP ATAPA A |RAP|ATAPA|TAPARAPAPA
--RAPA TAPAT T |RAPA|TAPAT|APARAPAPA
-RAPAT APATA (P2-L4) |RAPAT|APATA|PARAPAPA
ATAPAT APARA (P2-L3) RAP|ATAPAT|APARA|PAPA
PATAPA RAPAP R RAPATA|PATAPA|RAPAP|A
ATAPAR APAPA (P2-L3) RAPATAP|ATAPAR|APAPA|
FIUBA Organización de Datos - Curso Servetto 95
Algoritmo Lz77
(por Diccionario)
● Ejemplo de Compresión fuente
RAPATAPATAPARAPAPA :
● 6 caracteres * 9 bits = 54 bits
● 4 pares(pos,long) * 6 bits= 24 bits
● Total: 78 bits= 9,75 bytes.
● Tam. Original: 18 caracteres => 18 bytes
● Tasa Compresión= 9,75 bytes/18 bytes* 100% = 54,16%
R A P A T (P2-L4) (P2-L3) R (P2-L3) (P0-L2)
FIUBA Organización de Datos - Curso Servetto 96
Algoritmo Lz77
(por Diccionario)
● Descompresión:
● El descompresor tiene la misma configuracion que el
compresor.
● La idea de la descompresión es leer primero un
bit(para saber cuantos leer luego).
● Considerando que un 0 es un caracter y 1 (pos,long)
● Si ese bit es 0 -> leemos 8 bits mas. ● Si ese bit es 1 -> leemos 5 bit mas.
FIUBA Organización de Datos - Curso Servetto 97
Algoritmo Lz77
(por Diccionario)
● Ejemplo de Descompresión fuente
RAPATAPATAPARAPAPA :
Ventana de Memoria(6) Lectura del archivo comprimido Salida del Descompresor
--- R R ---R A A ----RA P P ---RAP A A --RAPA T T -RAPAT (P2-L4) APAT ATAPAT (P2-L3) APA PATAPA R R ATAPAR (P2-L3) APA PARAPA (P0-L2) PA
FIUBA Organización de Datos - Curso Servetto 98
Referencias
● Jacob Ziv and Abraham Lempel; A Universal
Algorithm for Sequential Data Compression,
IEEE Transactions on Information Theory, 23(3), pp. 337–343, May 1977.
FIUBA Organización de Datos - Curso Servetto 99
Algoritmo Lz78/W
(por Diccionario)
●Abraham Lempel y Jacob Ziv en 1978
●También utiliza un diccionario adaptativo, pero de todos los símbolos anteriores
●La cantidad de bits emitidos dependen del tamaño de la tabla ●Original: 11 letras x 8 bits = 88 bits
FIUBA Organización de Datos - Curso Servetto 100
Algoritmo Lz78/W
(por Diccionario)
●Descompresión
–El tamaño de la tabla indica la cantidad de bits que tengo que leer –Se empieza con el diccionario vacío y se va regenerando
–Siempre se almacena lo anterior más la primera letra del próximo
●Caso Especial
–Cuando para agregar una entrada en la tabla tengo que leer un símbolo que no tengo
¿Cómo lleno este
símbolo? LA (256) + L
(primera letra del símbolo actual)
FIUBA Organización de Datos - Curso Servetto 101
Algoritmo Lz78/W
(por Diccionario)
● Ejemplo Compresión (Fte: TETETERARA)
Ubicación en el archivo String actual ¿Esta en Tabla? Codigo Emitido Actualizacion de Tablas
TETETERARA T SI --- --- ETETERARA TE NO T 256-TE ETETERARA E SI --- --- TETERARA ET NO E 257-ET TETERARA T SI --- --- ETERARA TE SI --- ---
TERARA TET NO 256 258-TET
TERARA T SI --- ---
ERARA TE SI --- ---
RARA TER NO 256 259-TER
RARA R SI --- --- ARA RA NO R 260-RA ARA A SI --- --- RA AR NO A 261-AR RA R SI --- --- A RA SI --- --- fin 260 ---
FIUBA Organización de Datos - Curso Servetto 102
Algoritmo Lz78/W
(por Diccionario)
● Ejemplo de descompresion (Fc = T-E-256-258-E-R-A-262-A)
● Archivo original: F=TETETETERAAAA
Ubicación en el archivo String actual ¿Esta en Tabla? Codigo Emitido Actualizacion de Tablas
T-E-256-258-E-R-A-262-A T SI T ---
E-256-258-E-R-A-262-A E SI E 256-TE
256-258-E-R-A-262-A 256 SI TE 257-ET
258-E-R-A-262-A 258
NO (caso
especial) TE* TET
258-TE* (lo emitido en el paso anterior + primer carácter de emisión actual) Primer caracter = T 258-TET E-R-A-262-A E SI E 259-TETE R-A-262-A R SI R 260-ER A-262-A A SI A 261-RA
262-A 262 NO A* AA 262-A* 262-AA
FIUBA Organización de Datos - Curso Servetto 103
Algoritmo Lz78/W
(por Diccionario)
● La tabla crece a medida que avanza la compresión y
aumenta la complejidad de las búsquedas y comparaciones.
● El diccionario puede implementarse como un árbol para
acelerar las búsquedas.
● Clearing: Para evitar que la tabla crezca indefinidamente
(ya no gano demasiado en compresión) puedo:
●Dejar de agregar cosas al diccionario
●Limpiar la tabla (usando un carácter especial que simbolice
limpieza de tabla o no).
FIUBA Organización de Datos - Curso Servetto 104
Referencias
● Terry Welch, "A Technique for High-Performance
Data Compression", IEEE Computer, June 1984, p. 8–19.
FIUBA Organización de Datos - Curso Servetto 105
Algoritmos de
Compresión
Predictores
Algoritmo Aritmético de Orden mayor a 1 Algoritmo PPMC
FIUBA Organización de Datos - Curso Servetto 106
Algoritmos de Compresión
Predictores
● Utilizan estructuras de datos para registrar pasos anteriores de la
compresión.
● Se parte de una concepción estadística, que reconoce como
altamente probable la aplicación de la misma acción ante una misma situación (eso es el acierto predictor).
● Se basa en algoritmos estadísticos clásicos, pero modifican la
forma de calcular la probabilidad de las apariciones,
considerando probabilidades condicionales (Contextos).
● Funciona bien cuando se cumple la regla de la concepción
FIUBA Organización de Datos - Curso Servetto 107
Algoritmos de Compresión
Predictores
● Contextos:
● Se parte de la base de que un texto tiene secuencias que se
repiten.
– Ej: En un programa escrito en C, luego del carácter “;” es altamente probable un fin de línea.
● Para cada carácter, el o los caracteres precedentes son su
contexto.
● El orden de un contexto es la cantidad de caracteres
precedentes que se toman en cuenta para predecir. Orden 0 (“O(0)”) significa ningún carácter. Orden 1 (“O(1)”), un carácter.
● Aumentan considerablemente el consumo de memoria por la
FIUBA Organización de Datos - Curso Servetto 108
Algoritmo Aritmético O(n)
(Predictor)
FIUBA Organización de Datos - Curso Servetto 109 A - B - C
Algoritmos Aritmético O(n)
(Predictor)
● Es una generalización del Algoritmo Aritmético de compresión.
● Separa las estructuras de Emisión y de Distribución de probabilidades. ● Para cada caracter (o cadena) se almacena una tabla de probabilidades
asociada, para considerar a todos los caracteres que le pueden seguir.
Dado el Contexto 1 A - B - C Dado el Contexto 2 A - B - C Dado el Contexto 3 1111 0000 Segmento de emisión 0101 0001 1011 0010 Emito '0'
FIUBA Organización de Datos - Curso Servetto 110
Algoritmos de Compresión
Predictores
● Ventajas de utilizar contextos
• Utilizar distintas tablas de probabilidades según el contexto ayuda a predecir mejor
• Una mejor predicción equivale a mejores modelos probabilísticos
• Mejores modelos equivalen a una menor emisión en bits.
FIUBA Organización de Datos - Curso Servetto 111
Algoritmos de Compresión
Predictores
● Desventajas de utilizar
contextos
• O (0) necesita una tabla de 256 posiciones(una para cada
carácter)
• O (1) necesita una tabla de
256x256 posiciones. O (2), una tabla de 256x256x256.
• El tamaño de las tablas crece exponencialmente.
• Si la fuente no tiene patrones repetidos (no es estructurada), utilizar contextos no mejora la compresión A - B - C - D - .. A - B - C - D - .. A - B - C - D - .. A - B - C - D - .. A - B - C - .. A - B - C - .. A - B - C - ..
FIUBA Organización de Datos - Curso Servetto 112
Algoritmo Aritmético
(Orden 1)
● Compresión de ABACAB:
●Compresión del caracter ‘A' - (Posicion: 0) Contexto \b: A=1, B=1, C=1
Piso inicial: 0 - Techo Inicial 255 Intervalo: 256
N.Piso = 0 + 256 * 0 = 0 N. Techo = 0 + 256 * 1 / 3 - 1 = 84
Resultado de la normalización:
Piso: 00000000 (0) -> 00000000 (0) Techo: 01010100 (84) -> 10101001 (169) Emisión: 0 C. underflow: 0
●Compresión del caracter ‘B' - (Posicion: 1)
Contexto A: A=1, B=1, C=1 Contexto A: A=1, B=2, C=1
Piso inicial: 0 - Techo Inicial 169 Intervalo: 170
N.Piso = 0 + 170 * 1 / 3 = 56 N. Techo = 0 + 170 * 2 / 3 - 1 = 112
Resultado de la normalización:
Piso 00111000 (56) -> 01110000 (112) Techo: 01110000 (112) -> 11100001 (225) Emisión: 0 C. underflow: 0
FIUBA Organización de Datos - Curso Servetto 113
Algoritmo Aritmético
(Orden 1)
● Compresión de ABACAB :
●Compresión del caracter ‘A' - (Posicion: 2)
Contexto B: A=1, B=1, C=1 Contexto B: A=2, B=1, C=1
Piso inicial: 112 - Techo Inicial 225 Intervalo: 114
N.Piso = 112 + 114 * 0 / 3 = 112 N. Techo = 112 + 114 * 1 / 3 - 1 = 149
Resultado de la normalización:
Piso: 01110000 (112) -> 01000000 (64) Techo: 10010101 (149) -> 11010111 (215) Emisión: 0 C. underflow: 2
●Compresión del caracter ‘C' - (Posicion: 3)
Contexto A: A=1, B=2, C=1 Contexto A: A=1, B=2, C=2
Piso inicial: 64 - Techo Inicial 215 Intervalo: 152
N.Piso = 64 + 152 * 3 / 4 = 178 N. Techo = 64 + 152 * 4 / 4 - 1 = 215
Resultado de la normalización:
Piso: 10110010 (178) -> 01001000 (72) Techo: 11010111 (215) -> 11011111 (223) Emisión: 100(Underflow) C. underflow: 1
FIUBA Organización de Datos - Curso Servetto 114
Algoritmo Aritmético
(Orden 1)
● Compresión de ABACAB:
●Compresión del caracter ‘A' - (Posicion: 4)
Contexto C: A=1, B=1, C=1 Contexto C: A=2, B=1, C=1
Piso inicial: 72 - Techo Inicial 223 Intervalo: 152
N.Piso = 72 + 152 * 0 / 3 = 72 N. Techo = 72 + 152 * 1 / 3 - 1 = 121
Resultado de la normalización:
Piso: 01001000 (72) -> 00100000 (32) Techo: 01111001 (121) -> 11100111 (231) Emisión: 011(Underflow) C. underflow: 0
●Compresión del caracter ‘B' - (Posicion: 5)
Contexto A: A=1, B=2, C=2 Contexto A: A=1, B=3, C=2
Piso inicial: 32 - Techo Inicial 231 Intervalo: 200
N.Piso = 32 + 200 * 1 / 5 = 72 N. Techo = 32 + 200 * 3 / 5 - 1 = 151
Al ser el ultimo caracter, se emite el piso, incluyendo los underflows: Piso: 01001000 (72) --- > Emisión: 01001000
FIUBA Organización de Datos - Curso Servetto 115
Algoritmo Aritmético
(Orden 1)
● Descompresión de ABACAB:
●Descompresión del caracter ‘A‘ Contexto \b: A=1, B=1, C=1
●Rangos iniciales:
●C = [170 – 255]; B = [85 - 169] ; A = [0 – 84]
●Se leen 8 bits: 0010001 (32) -> Cae en el rango de la A(0-84) ●Se emite una A.
●Descompresión del caracter ‘B‘
Contexto A: A=1, B=1, C=1 Contexto A: A=1, B=2, C=1
Se plantea el nuevo intervalo(0-84)(Overflow de 0)
Resultado de la normalización(Overflow de 0):
Piso: 00000000 (0) -> 00000000 (0) Techo: 01010100 (84) -> 10101001 (169)
Nuevos Intervalos:
C [113 – 169]; B [55 – 112] ; A [000 - 55]
Debido al overflow, descartamos el 1er bit leído anteriormente y leemos uno mas del archivo: 001000111 01000111 (71) -> Cae en el rango de la B
FIUBA Organización de Datos - Curso Servetto 116
Algoritmo Aritmético
(Orden 1)
● Descompresión de ABACAB:
●Descompresión del caracter ‘A‘
Contexto B: A=1, B=1, C=1 Contexto B: A=2, B=1, C=1
Se plantea el nuevo intervalo(56-169)(Overflow de 0)
Resultado de la normalización(Overflow de 0):
Piso 00111000 (56) -> 01110000 (112) Techo: 01110000 (112) -> 11100001 (225) C [188 - 225]; B [150 - 187]; A [112 - 149] = [01110000 - 10010101]
Debido al overflow, descartamos el 1er bit leído anteriormente y leemos uno mas del archivo: 0010001101 10001110 (142) -> Cae en el rango de la A
Se emite una A.
●Descompresión del caracter ‘C‘
Contexto A: A=1, B=2, C=1 Contexto A: A=1, B=2, C=2
Se plantea el nuevo intervalo(112-149)(Underflow de 2)
Resultado de la normalización(Underflow de 2):
Piso 01110000 (112) -> 01000000 (64) Techo: 10010101 (149) -> 110101111 (215)
Nuevos Intervalos:
C [178 - 215] ; B [102 – 177]; A [64 - 101]
Debido al Underflow, dejamos fijo el 1er bit en inspección y luego descartar tantos bits como underflows tengamos(2 bit en este caso, 0), completar del archivo leyendo los bits necesarios para 1 byte : 001(Fijo)00(Descartados)0110100(leídos)
10110100 (180) -> Cae en el rango de la C
FIUBA Organización de Datos - Curso Servetto 117
Algoritmo Aritmético
(Orden 1)
● Descompresión de ABACAB:
●Descompresión del caracter ‘A‘
Contexto C: A=1, B=1, C=1 Contexto C: A=2, B=1, C=1
Se plantea el nuevo intervalo(178-215)(Overflow 1 y Underflow -> Cont. UF=1)
Resultado de la normalización(Overflow de 1 y Underflow de 1):
Piso: 10110010 (178) -> 01001000 (72) Techo: 11010111 (215) -> 11011111 (223)
Nuevos Intervalos:
C [173 - 223]; B [122 - 172] ; A [72 – 121]
Debido al Overflow, descartamos el bit que había quedado fijo.
Debido al Underflow, dejamos fijo el 1er bit en inspección y luego descartar tantos bits como underflows tengamos(1 bit en este caso, 1), completar del archivo leyendo los bits necesarios para 1 byte : 001(Descartado)000(Fijo)1(Descartado)1010010(leídos) 01010010 (82) -> Cae en el rango de la A
Se emite una A.
●Descompresión del caracter ‘B‘
Contexto A: A=1, B=2, C=2 Contexto A: A=1, B=3, C=2
Se plantea el nuevo intervalo(72-121)(Overflow de 2)
Resultado de la normalización(Overflow de 2):
Piso: 01001000 (72) -> 00100000 (32) Techo: 01111001 (121) -> 11100111 (231)
Nuevos Intervalos:
C [152 - 231] ; B [72 – 151] ; A [32 - 71]
Debido al overflow, descartamos los 2 1eros bits leídos anteriormente y leemos 2 mas del archivo: 0010001101001000(Leidos) 01001000 -> Cae en el rango (es el piso) de la B
FIUBA Organización de Datos - Curso Servetto 118
Referencias
● Gordon Cormack and Nigel Horspool, "Data
Compression using Dynamic Markov Modelling", Computer Journal 30:6 (December 1987)
FIUBA Organización de Datos - Curso Servetto 119
Algoritmo PPMC
(Prediction by Partial
Matching Mode C)
FIUBA Organización de Datos - Curso Servetto 120
Algoritmo PPMC
(Predictor)
• Compresor predictor con base estadística (utiliza un aritmético).
• No utiliza un solo contexto para comprimir, sino varios para una mejor predicción (hasta 6).
• Soluciona algunas de las desventajas de utilizar contextos.
FIUBA Organización de Datos - Curso Servetto 121
Algoritmo PPMC
(Predictor)
• Problema de utilización de contextos al inicializar todos los caracteres en forma equiprobable.
• En el contexto del carácter “Q”, una “U” debería tener probabilidad casi 1.
• Luego de 20 veces de encontrado el patrón, la probabilidad es de, solamente, 21/277.
FIUBA Organización de Datos - Curso Servetto 122
Algoritmo PPMC
(Predictor)
• Si inicializamos los caracteres en frecuencia 0, no tenemos probabilidades para emitir.
• Se agrega un carácter especial (carácter de ESCAPE), que se inicializa con frecuencia 1.
• Cuando no se encuentra el carácter a emitir en el contexto actual, se emite un ESCAPE y se
FIUBA Organización de Datos - Curso Servetto 123
Algoritmo PPMC
(Predictor)
• Compresión:
• Se usan varios contextos.
• Se comienza desde el contexto de mayor orden y si el carácter a emitir se encuentra con probabilidad 0, se emite un ESCAPE y se va al contexto
inmediatamente menor.
• El último contexto es el -1. Contiene a los 256
caracteres ASCII y al EOF con frecuencia 1 (fija para todos).
FIUBA Organización de Datos - Curso Servetto 124
Algoritmo PPMC
(Predictor)
• Exclusión:
– Se excluye del contexto actual, los caracteres leídos en contextos anteriores.
– Si pasé por un contexto donde hubo caracteres con frecuencia mayor a 0 y no los utilicé, tampoco los necesito en la tabla del contexto actual.