Compresión de Datos Introducción Introducción ¿Por qué es importante conocer sobre Compresión? ¿Qué conceptos involucra? ¿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 (tv-digital, telefonía IP). ● FIUBA Organización de Datos - Curso Servetto 3 ¿Qué area de la ciencia aplica? ● ● FIUBA La compresión como álgebra, análisis matemático, probabilidad y estadística y algoritmia aplicados. Aplica a Teoría de la Información. Organización de Datos - Curso Servetto 4 ¿Qué conceptos involucra?Teoría de la Información ● Información (definición epistemológica) ● ● Datos Interpretados. Datos ● Característica (dimensión) + Valor (medida) COLOR = ROJO FIUBA Organización de Datos - Curso Servetto 5 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 TRANSFORMACIÓN Organización de Datos - Curso Servetto 6 Teoría de la Información ● Información (definición cuantitativa) ● FIUBA Shannon 1948 – matemática estadística. Organización de Datos - Curso Servetto 7 Teoría de la información (matemática estadística) ● Entropía (definición estadístical) ● ● ● FIUBA Teorema Shannon (información promedio). Dentro de una fuente F, recibimos el símbolo Fi, que tenía probabilidad pi H(F) es la entropía de toda la fuente F Organización de Datos - Curso Servetto 8 Teoría de la información (matemática analítica) ● Transformada (definición analítica) ● ● ● FIUBA 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 Organización de Datos - Curso Servetto es cuantificable. 9 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 FIUBA (Binario comprimido) Organización de Datos - Curso Servetto 10 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). – => 01010101111001 => FIUBA 11 Organización de Datos - Curso Servetto 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 12 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 13 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 B = 0100 Prefijo A = 001111 B = 0001 FIUBA C = 1000 D = 10 C = 010 D = 10 – Los códigos prefijos son instantáneos. – Los códigos prefijos son unívocamente decodificables. Organización de Datos - Curso Servetto 14 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 FIUBA U = 110 Organización de Datos - Curso Servetto 15 Referencias ● FIUBA David Salomon , “A Concise Introduction to Data Compression ”, Springer-Verlag London Limited 2008 , pp 21-29. Organización de Datos - Curso Servetto 16 Algoritmos de Codificación ● ● ● ● FIUBA 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 información de control extra. Organización de Datos - Curso Servetto 17 Algoritmos de Codificación ● Clasificación según la forma de reconocer la redundancia ● Estadístico – ● Run-Length ● Por Diccionario – FIUBA Los códigos aproximan a la representación del teorema de Shanon Los códigos se generan en base a la repetición de mensajes. No aplica la teoría de Shanon. Organización de Datos - Curso Servetto 18 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 – FIUBA Combina algoritmos de diferentes características (Estadístico, por Diccionario, etc.) Organización de Datos - Curso Servetto 19 Algoritmos de Codificación ● Clasificación según la forma de procesar los datos ● FIUBA 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 puede generar. Organización de Datos - Curso Servetto 20 Algoritmos de Codificación(Cont.) ● Clasificación según la forma de procesar los datos ● FIUBA 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 de la compresión. Organización de Datos - Curso Servetto 21 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 22 Organización de Datos - Curso Servetto Formas de Finalizar un Archivo comprimido(Cont.) ● Mensaje Especial ● ● FIUBA 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. Ej: caracter especial “EOF”. Organización de Datos - Curso Servetto 23 Algoritmos de Compresión Sin Pérdida (Lossless) Estadísticos Por Diccionario Predictores Híbridos FIUBA Organización de Datos - Curso Servetto 24 Algoritmos de Compresión Estadísticos Algoritmo de Huffman Algoritmo Aritmético FIUBA Organización de Datos - Curso Servetto 25 Algoritmo de Huffman (Estadístico) FIUBA Organización de Datos - Curso Servetto 26 Algoritmo de Huffman (Estadístico) ● Árbol de generación de códigos. ● ● ● ● ● FIUBA 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 código que reemplazará al caracter. Organización de Datos - Curso Servetto 27 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. ● ● Por ejemplo, si se tiene el siguiente árbol: FIUBA Organización de Datos - Curso Servetto 28 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 compresor Estadístico. ● FIUBA Organización de Datos - Curso Servetto 29 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 30 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. ● 5) Se genera el ultimo nodo, que es la raiz del arbol(con nodos hijo, E-C-I y J-Y-R). FIUBA Organización de Datos - Curso Servetto 31 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 32 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 Análisis de la compresión FIUBA Organización de Datos - Curso Servetto 33 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 34 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 35 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. Emisión FIUBA ---- ---- J ---- E ---- R ---- R ---- ---- Y ---- R Organización de Datos - Curso Servetto ---- ---- I ---- ---- C ---- E 36 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 37 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 38 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 39 Algoritmo de Huffman (método dinámico) ● Descompresión: ● ● ● FIUBA 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) Organización de Datos - Curso Servetto 40 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 Tabla ---- ---- J(2) ---- ---- E(2) ---- ---- R(2) ---- R(3) ---- ---- Y(2) ---- R(3) ---- ---- I(2) ---- ---- C(2) ---- ---- E(3) FIUBA Organización de Datos - Curso Servetto 41 Algoritmo de Huffman (método dinámico) ● Descompresión(Cont.): ● FIUBA Arboles finales generados en cada paso de la tabla: Organización de Datos - Curso Servetto 42 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 FIUBA de oro: Si #A > #B => F(A) ≤ F (B) Organización de Datos - Curso Servetto 43 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 frecuencia total del nodo (Ej: C anterior) ● FIUBA Organización de Datos - Curso Servetto 44 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 45 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 46 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 47 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 48 Algoritmo de Huffman Manejo Eficiente (método dinámico) ● Ejemplo de compresión(fte: porotosEOF) ● Arbol inicial(vocabulario o,p,r,s,t,EOF): FIUBA Organización de Datos - Curso Servetto 49 Algoritmo de Huffman Manejo Eficiente (método dinámico) ● Ejemplo de compresión(fte: porotosEOF) 1) Arbol Inicial 2)Lectura p(Emisión 10) 3) Lectura o(Emision 11) 4)Lectura r(Emisión 011) FIUBA Organización de Datos - Curso Servetto 50 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) 7) Lectura o(Emision 01) 8)Lectura s(Emisión 110) FIUBA Organización de Datos - Curso Servetto 51 Algoritmo de Huffman Manejo Eficiente (método dinámico) ● Ejemplo de compresión(fte: porotosEOF) 9) Lectura EOF(Emision 101) ● ● ● FIUBA Notar que se emite con el arbol de la figura anterior a la lectura. En el ultimo paso no es neceseario actualizar el arbol. Emision final(sin guiones): 10-11-011-11-001-01-110= 20 bits= 2,5 bytes. Organización de Datos - Curso Servetto 52 Algoritmo de Huffman Manejo Eficiente (método dinámico) ● Ejemplo de descompresión(fte: porotosEOF) ● Arbol inicial(vocabulario o,p,r,s,t,EOF): FIUBA Organización de Datos - Curso Servetto 53 Algoritmo de Huffman Manejo Eficiente (método dinámico) ● Ejemplo de descompresión(fte: porotosEOF) FIUBA ● 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. ● 2) Se lee bit 1, luego bit 1 -> se emite o-> se actualiza el arbol. Organización de Datos - Curso Servetto 54 Algoritmo de Huffman Manejo Eficiente (método dinámico) ● Ejemplo de descompresión(fte: porotosEOF) FIUBA ● 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. ● 4) Se lee bit 1, luego bit 1 -> se emite o-> se actualiza el arbol. Organización de Datos - Curso Servetto 55 Algoritmo de Huffman Manejo Eficiente (método dinámico) ● Ejemplo de descompresión(fte: porotosEOF) FIUBA ● 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. ● 6) Se lee bit 0, luego bit 1 -> se emite o-> se actualiza el arbol. Organización de Datos - Curso Servetto 56 Algoritmo de Huffman Manejo Eficiente (método dinámico) ● Ejemplo de descompresión(fte: porotosEOF) FIUBA ● 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. ● 8) Se lee bit 1, luego bit 0 y bit 1 -> se emite EOF Organización de Datos - Curso Servetto 57 Referencias ● FIUBA D.A. Huffman, "A Method for the Construction of Minimum-Redundancy Codes", Proceedings of the I.R.E., September 1952, pp 1098–1102. Huffman's original article. Organización de Datos - Curso Servetto 58 Algoritmo de Aritmético (Estadístico) FIUBA Organización de Datos - Curso Servetto 59 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 60 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 de 0 a 1 ● FIUBA Organización de Datos - Curso Servetto 61 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) ● FIUBA ● 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 ● Finalmente se emite un número del subintervalo elegido en el último paso Organización de Datos - Curso Servetto 62 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 bits de precisión ● FIUBA Organización de Datos - Curso Servetto 63 Algoritmo Aritmético (Estadístico) División de un intervalo: ● Se divide el intervalo [Piso1, TechoN] en N subintervalos de diversas longitudes ●Sea L = Techo N - Piso1 + 1 ●Techo = floor(Piso + P(s ).L) - 1 i i i ●Piso i+1 = Techoi + 1 ● En el siguiente paso, el subintervalo elegido es el que se subdivide ● FIUBA 64 Organización de Datos - Curso Servetto 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 1011 ● Emito el '1' y completo. 1000 FIUBA Organización de Datos - Curso Servetto 0000 65 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 1101 ● FIUBA UF=0 UF=1 Sumo '1' al contador De Underflow, Quito el segundo Bit y completo. 0110 Organización de Datos - Curso Servetto 0100 66 Algoritmo Aritmético (Estadístico) Es posible que tras normalizar un overflow, se descubra un underflow ● Techo: Piso: FIUBA 11011001 11100111 10101110 00111000 (U=1) Organización de Datos - Curso Servetto 67 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 ● Emisión: 1-00-1, nuevo valor de U=1 FIUBA Organización de Datos - Curso Servetto 68 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, pero comprime generalmente menos que el estático. ● FIUBA Organización de Datos - Curso Servetto 69 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. ●Se repite hasta llegar al último carácter ● FIUBA Organización de Datos - Curso Servetto 70 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 los caracteres, que es igual a las emisiones totales. ● FIUBA Organización de Datos - Curso Servetto 71 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 72 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 73 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 Emision final:1-0-0-1000-00111000 FIUBA Organización de Datos - Curso Servetto 74 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 precisión del compresor/descompresor) ● FIUBA Organización de Datos - Curso Servetto 75 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 Se emite una A. FIUBA Organización de Datos - Curso Servetto 76 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 Se emite una B. FIUBA Organización de Datos - Curso Servetto 77 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 : 10000111 -> Cae en el rango de la C 1001(Fijo)0(Descartado)0000111(leído) 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 Se emite una A. Además es el piso del intervalo y sabemos que teniamos 6 caracteres-> Fin. FIUBA Organización de Datos - Curso Servetto 78 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 ●Se repite hasta llegar al último carácter ● FIUBA Organización de Datos - Curso Servetto 79 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 80 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 81 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 Emision final: 0-01-100010111 FIUBA Organización de Datos - Curso Servetto 82 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 Se emite una B. FIUBA Organización de Datos - Curso Servetto 83 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: 10001011 (139) -> Cae en el rango de la A 00110001011(leídos) 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 Se emite una C. FIUBA Organización de Datos - Curso Servetto 84 Referencias ● FIUBA 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. Organización de Datos - Curso Servetto 85 Algoritmos de Compresión No estadística Algoritmo Lz77 Algoritmo Lz78/W FIUBA Organización de Datos - Curso Servetto 86 Algoritmos de Compresión Run Length ● ● ● FIUBA 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 mas complejos Organización de Datos - Curso Servetto 87 Algoritmos de Compresión Run Length Ejemplos: ABCABCABC 1A1B1C1A1B1C1A1B1C AAABBBCCC 3A3B3C ● FIUBA Estadístico: Mal Run length.: Mal Estadístico: Igual de mal Run Length.: Bien! Notar que aumenta el tamaño si no se repiten los caracteres Organización de Datos - Curso Servetto 88 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 servetto FIUBA Organización de Datos - Curso Servetto 89 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 Memoria (Memory Window) Tamaño M Ventana de Inspección (Lookahead Window) Tamaño N Input Logitud Mínima de Match (A) FIUBA Organización de Datos - Curso Servetto 90 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: ● ● ● FIUBA 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)) + 1 bit de diferencia entre carácter y dupla = (K+K2+1) bits por emisión Organización de Datos - Curso Servetto 91 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. ● • FIUBA 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 Organización de Datos - Curso Servetto 92 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 ● ● ● FIUBA 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. Organización de Datos - Curso Servetto 93 Algoritmo Lz77 (por Diccionario) ● Ejemplo de Compresión fuente RAPATAPATAPARAPAPA : Ventana de Memoria(6) Ventana de Inspeccion(5) Salida del Compresor FIUBA 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| PARAPA PA--- (P0-L2) RAPATAPATA|PARAPA|PA| Organización de Datos - Curso Servetto 94 Algoritmo Lz77 (por Diccionario) ● ● Ejemplo de Compresión fuente RAPATAPATAPARAPAPA : 6 caracteres * 9 bits = 54 bits R A P A T (P2-L4) 4 pares(pos,long) * 6 bits= 24 bits (P2-L3) ● Total: 78 bits= 9,75 bytes. (P2-L3) ● Tam. Original: 18 caracteres => 18 bytes ● ● FIUBA R (P0-L2) Tasa Compresión= 9,75 bytes/18 bytes* 100% = 54,16% Organización de Datos - Curso Servetto 95 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) ● ● FIUBA Si ese bit es 0 -> leemos 8 bits mas. Si ese bit es 1 -> leemos 5 bit mas. Organización de Datos - Curso Servetto 96 Algoritmo Lz77 (por Diccionario) ● Ejemplo de Descompresión fuente RAPATAPATAPARAPAPA : Ventana de Memoria(6) ----------R ----RA ---RAP --RAPA -RAPAT ATAPAT PATAPA ATAPAR PARAPA FIUBA Lectura del archivo comprimido R A P A T (P2-L4) (P2-L3) R (P2-L3) (P0-L2) Organización de Datos - Curso Servetto Salida del Descompresor R A P A T APAT APA R APA PA 97 Referencias ● FIUBA Jacob Ziv and Abraham Lempel; A Universal Algorithm for Sequential Data Compression, IEEE Transactions on Information Theory, 23(3), pp. 337–343, May 1977. Organización de Datos - Curso Servetto 98 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 ●Comprimido: 1 código x 8 bits + 6 códigos x 9 bits = 62 bits ● FIUBA Organización de Datos - Curso Servetto 99 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 100 Algoritmo Lz78/W (por Diccionario) ● Ejemplo Compresión (Fte: TETETERARA) Ubicación en el archivo String actual TETETERARA T ETETERARA TE ETETERARA E TETERARA ET TETERARA T ETERARA TE TERARA TET TERARA T ERARA TE RARA TER RARA R ARA RA ARA A RA AR RA R A RA fin FIUBA ¿Esta en Tabla? SI NO SI NO SI SI NO SI SI NO SI NO SI NO SI SI Codigo Emitido ----T ----E --------256 --------256 ----R ----A --------260 Organización de Datos - Curso Servetto Actualizacion de Tablas ----256-TE ----257-ET --------258-TET --------259-TER ----260-RA ----261-AR ------------101 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-TE* (lo emitido en el paso anterior + primer carácter de emisión actual) FIUBA Primer caracter = T 258-E-R-A-262-A 258 NO (caso especial) 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 A A SI A 263-AAA TE* TET 258-TET Organización de Datos - Curso Servetto 102 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). ● Usar técnicas de reemplazo de entradas (Ej: LRU) ● FIUBA Organización de Datos - Curso Servetto 103 Referencias ● FIUBA Terry Welch, "A Technique for High-Performance Data Compression", IEEE Computer, June 1984, p. 8–19. Organización de Datos - Curso Servetto 104 Algoritmos de Compresión Predictores Algoritmo Aritmético de Orden mayor a 1 Algoritmo PPMC FIUBA Organización de Datos - Curso Servetto 105 Algoritmos de Compresión Predictores ● ● ● ● FIUBA 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 estadística situación-acción. Organización de Datos - Curso Servetto 106 Algoritmos de Compresión Predictores ● Contextos: ● Se parte de la base de que un texto tiene secuencias que se repiten. – ● ● ● FIUBA 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 gran cantidad de datos que deben registrar. Organización de Datos - Curso Servetto 107 Algoritmo Aritmético O(n) (Predictor) FIUBA Organización de Datos - Curso Servetto 108 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 Dado el Contexto 2 A - - FIUBA B B C C Dado el Contexto 3 Segmento de emisión 1111 0101 1011 A B - Emito '0' C 0000 Organización de Datos - Curso Servetto 0001 0010 109 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 110 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 FIUBA A B C D .. Organización de Datos - Curso Servetto A B C D .. A B C .. A B A B C D .. C .. A B C D .. A B C .. 111 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 112 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 113 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 Emision final:0-0-100-011-01001000 FIUBA Organización de Datos - Curso Servetto 114 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 Se emite una B. 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 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 Se emite una C. FIUBA Organización de Datos - Curso Servetto 116 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 : 01010010 (82) -> Cae en el rango de la A 001(Descartado)000(Fijo)1(Descartado)1010010(leídos) 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 Se FIUBA emite una B. Organización de Datos - Curso Servetto 117 Referencias ● FIUBA Gordon Cormack and Nigel Horspool, "Data Compression using Dynamic Markov Modelling", Computer Journal 30:6 (December 1987) Organización de Datos - Curso Servetto 118 Algoritmo PPMC (Prediction by Partial Matching Mode C) FIUBA Organización de Datos - Curso Servetto 119 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 120 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. • Es muy ineficiente, aprende lento. FIUBA Organización de Datos - Curso Servetto 121 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 actualiza la tabla. FIUBA Organización de Datos - Curso Servetto 122 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 123 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. – Aplicar exclusión mejora el nivel de compresión. FIUBA Organización de Datos - Curso Servetto 124 Algoritmo PPMC (Predictor) • Para la emisión se utiliza un compresor aritmético que aprovecha las distribuciones de probabilidad del contexto en el que estoy parado para emitir. • Comienza con el intervalo inicial, y va emitiendo y normalizando siempre el mismo intervalo para cada contexto (no se utilizan intervalos diferentes para cada uno) FIUBA Organización de Datos - Curso Servetto 125 Algoritmo PPMC (Predictor) • Cuando se pasa de la emisión de un contexto a otro se hace “zoom” sobre el intervalo actual para la emisión correspondiente y, para el próximo contexto, se utiliza el subintervalo obtenido (normalizado). • La salida en bits es la del compresor aritmético. Se debe agregar información de control sobre el mayor orden de contexto utilizado. FIUBA Organización de Datos - Curso Servetto 126 Algoritmo PPMC (Predictor) • Descompresión: – Se toma la tira de bits emitida por el aritmético y se descomprime según éste. – Con cada emisión que se obtiene, se van actualizando las tablas de los contextos, de la misma forma en que se comprimió. FIUBA Organización de Datos - Curso Servetto 127 • Ejemplo: Algoritmo PPMC (Predictor) – Orden: 2. Fuente: DIVIDIDOS CTX -1 CTX 0 ASCII 0 - ASCII 255 + EOF ESC(1) CTX 1 D| CTX 2 ESC(1) ESC(1/2), D(1/2) D | ESC(1/2), I(1/2) --------------------------I| ESC(1) DI | FIUBA Lectura ESC(1), D(1/257) D ESC(1), ESC(1/2), I(1/256) I ESC(1), ESC(1), ESC(2/4), V(1/255) V ESC(1), ESC(1), I(1/6) I ESC(1) ESC(2/4), D(1/4), I(1/4) ESC(3/6), D(1/6), I(1/6), V(1/6) Emisión I | ESC(1/2), V(1/2) --------------------------- DI | ESC(1/2), V(1/2) V| ESC(1) ---------------------------------IV | ESC(1) Organización de Datos - Curso Servetto 128 Algoritmo PPMC (Predictor) V | ESC(1), I(1/2) ESC(3/7), D(1/7), I(2/7), V(1/7) I| ESC(2/4), V(1/4), D(1/4) ESC(3/8), D(2/8), I(2/8), V(1/8) D | ESC(1/3), I(2/3) I| ESC(2/5), V(1/5), D(2/5) FIUBA IV | ESC(1/2), I(1/2) -------------------------------- ESC(1), ESC(1/2), VI | ESC(1) D(1/6) D VI | ESC(1/2), D(1/2) -------------------------------ID | ESC(1) ESC(1), I(1/2) I ID | I(1/2) ESC(1/2), D(1/3) D ESC(1/2), ESC(1), ESC(3/6), O(1/254) O ESC(1/2), DI | ESC(2/4), V(1/4), D(1/4) ESC(4/10), D(2/10), I(2/10), V(1/10), O(1/10) D| ESC(2/5), I(2/5), O(1/5) ------------------------O| ESC(1) ID | ESC(2/4), I(1/4), O(1/4) -------------------------------- ESC(1), ESC(1), DO | ESC(1) ESC(4/10), S(1/253) S ESC(5/12), D(2/12), I(2/12), V(1/12), O(1/12), S(1/12) O| ESC(1/2), S(1/2) ------------------------S| ESC(1) DO | ESC(1/2), S(1/2) -------------------------------- ESC(1), ESC(1), OS | ESC(1) ESC(5/12), EOF(1/252) EOF Organización de Datos - Curso Servetto 129 Algoritmo PPMC (Predictor) ● Emisión de los primeros 4 caracteres (DIVI) ● ● ● ● FIUBA D es el carácter ASCII número 68, I es el número 73 y V es el 86 Usaremos precisión de 10 bits para que sea suficiente El carácter EOF se toma como el número 257, por lo que será el de techo más alto Los ESC(1) no hace falta indicarlos dado que no modifican el intervalo (no se emite ningún bit) Organización de Datos - Curso Servetto 130 Algoritmo PPMC (Predictor) EOF 1023(1111111111) 1023(1111111111) | | | | | ... D ESC … | | | 512 (1000000000) | 273 (0100010001) | | | | ASCII 0 | D UN=3 0 (0000000000) Emisión: 01000 | | 291 (0100100011) I | | 288 (0100100000) … | | | | | | UN=0 0 (0000000000) - | | | … FIUBA EOF | | 270 (0100001110) 1023(1111111111) 1 000 Organización de Datos - Curso Servetto ASCII 0 | 0 (0000000000) - 01001000 - … 131 Algoritmo PPMC (Predictor) 1023(1111111111) | EOF | … ESC | | | 512(1000000000) I V 1023(1111111111) 639(1001111111) | | | | | | | | | 337 (0101010001) | | … | | ASCII 0 | Emisión: FIUBA 1 | 297 (0100101001) I | 0101010 UN=2 | 213 (0011010101) D 0 (0000000000) - | UN=0 | 0 (0000000000) V | UN=0 D | | 340 (0101010100) | | ESC | 128 (0010000000) - Organización de Datos - Curso Servetto 0 -… 132 Algoritmo PPMC (Predictor) ● Aclaración: ● FIUBA Cuando codificamos la “I” con 1/256 de probabilidad, es porque excluimos al carácter “D”. Esto implica que la “I” pase a ser el carácter número 72 de nuestro intervalo. Lo mismo sucede cuando emitimos la “V”, que pasa a ser el carácter número 84 de nuestro intervalo por exclusión de la “D” y la “I”) Organización de Datos - Curso Servetto 133 Algoritmo PPMC (Predictor) • Mientras mas alto el orden, mejor nivel de compresión? • La experiencia dicta que el óptimo está entre orden 4 y 5. • Órdenes mas grandes agregan overhead por la emisión de ESCAPES. FIUBA Organización de Datos - Curso Servetto 134 Algoritmos de Compresión Híbridos FIUBA Organización de Datos - Curso Servetto 135 Half Coding FIUBA Organización de Datos - Curso Servetto 136 Half Coding • Combina compresión run-length con estadística (Huffman) • Sólo es eficiente cuando un carácter es muy repetido, más que el 50% de ocurrencias • Para caracteres tan frecuentes, Huffman no es efectivo porque no puede codificar con menos de 1 bit • Puede ser estático o dinámico FIUBA Organización de Datos - Curso Servetto 137 Half Coding • Se codifica la longitud del carácter más probable • Por cada ocurrencia, se escribe su longitud en binario, se le suma 1, se le quita el bit más significativo (un 1) y se reemplaza 0=α y 1=β: 1=α, 2=β, 3=αα, 4=αβ, 5=βα, 6=ββ… • Se trata a α y β como dos caracteres más y se los codifica con Huffman FIUBA Organización de Datos - Curso Servetto 138 Half Coding: ejemplo estático Ejemplo: AAAABAACAAAAAAACDAAA ● Con Huffman estático se comprimiría a 26 bits: ● 1-1-1-1-010-1-1-00-1-1-11-1-1-1-00-011-1-1-1 ● Con Half Coding se convierte a: αβBβCαααCDαα y se comprime a 24 bits: 0-111-100-111-110-0-0-0-110-101-0-0 FIUBA Organización de Datos - Curso Servetto 139 LZHuff FIUBA Organización de Datos - Curso Servetto 140 LZHuff • Es un LZ77 que utiliza árboles de Huffman P5 Caracteres Longitudes (literals) (lenghts) P4 P3 P2 P1 Posiciones (distances) • Ahora no necesito un bit más para distinguir entre duplas y caracteres FIUBA Organización de Datos - Curso Servetto 141 LZHuff • Compresión: • El método de compresión es el mismo, solo cambia la forma de emitir los resultados. • Si caí en el sector de la longitud lo próximo que voy a leer es algo del árbol de posiciones. • Voy leyendo de a un bit y cuando llego a una hoja paro de leer y paso al siguiente. FIUBA Organización de Datos - Curso Servetto 142 LZHuff • Si hay longitudes que se repiten mucho, este método hace que se emitan con menos bits. • La cantidad de longitudes y posiciones que se pueden usar esta pre-definida. • Se usan códigos mas cortos para posiciones mas altas, ya que las repeticiones se dan en lo mas recientemente comprimido. Hay que definir distribución de probabilidades para el árbol estático. FIUBA Organización de Datos - Curso Servetto 143 LZP FIUBA Organización de Datos - Curso Servetto 144 LZP • Creado por Charles Bloom en 1994. Le agrega predicción al algoritmo de los LZ. • La idea es solucionar los problemas de LZ77: • Tiempo de búsqueda de substrings en ventana de inspección • Bits emitidos por posiciones • Agregar un factor estadístico mejora los resultados (Ejemplo: LZHuff) FIUBA Organización de Datos - Curso Servetto 145 LZP • Directamente no emito las posiciones. • Predigo posición de match, según el contexto. • Siempre pongo la longitud (puede ser 0) • Las actualizaciones de los contextos se mantienen en una tabla. FIUBA Organización de Datos - Curso Servetto 146 LZP 0 1 2 3 4 5 6 7 8 9 10 L A L A L A L A A A A Posición Lectura Contexto Comparar 0 L - 1 A 2 3 Arit Din O(0) Arit Din O(1) Salida Actualiz. Long Contexto Carácter - 0 \b L - - - 0 L A - L LA - 0 A L LA = 2 A AL - 0 L A AL = 3 … 0 0 A 0 L L Contexto 2 Long. FIUBA \b Long. L Long. A Organización de Datos - Curso Servetto 147 LZP • Utiliza un aritmético de orden 0 para emitir las longitudes y un aritmético de orden 1 para emitir los caracteres • Se suelen usar longitudes de 0 a 255 • Debemos especificar la longitud de contexto que utilizaremos y almacenarla como información de control • Al identificar un contexto previamente encontrado, se verifica en el archivo la posición donde se encontró ese contexto por ultima vez y se lee el archivo comparando con la lectura actual, para encontrar matches de la mayor longitud posible. FIUBA Organización de Datos - Curso Servetto 148 LZP • Ejemplo: • Fuente: AAAAAANTANANARIVO • Longitud de contexto: 2 • Vocabulario: {A,I,N,O,V,R} • Longitudes posibles de match: L0 - L4 • Precisión del aritmético: 8 bits • Solamente se mostrarán los primeros cuatro pares de emisiones de bits. FIUBA Organización de Datos - Curso Servetto 149 LZP Posición FIUBA Contexto Comparar con pos Salida Actualización 0 -- -- Long 0 - (\b,A) -- 1 -- -- Long 0 - (A,A) -- 2 AA -- Long 0 - (A,A) AA=2 3 AA 2 Long 3 - (A,N) AA=3 7 AN -- Long 0 - (N,T) AN=7 8 NT -- Long 0 - (T,A) NT=8 9 TA -- Long 0 - (A,N) TA=9 10 AN 7 Long 0 - (N,A) AN=10 11 NA -- Long 0 - (A,N) NA=11 12 AN 10 Long 1 - (A,R) AN=12 14 AR -- Long 0 - (R,I) AR=14 15 RI -- Long 0 - (I,V) RI=15 16 IV -- Long 0 - (V,O) IV=16 17 VO -- Long 0 - (O,EOF) Organización de Datos - Curso Servetto 150 LZP ● Compresión de AAAAAANTANANARIVO: Compresión de Longitud 0: ● L0=1, L1=1, L2=1 , L3=1 , L4=1 L0=2, L1=1, L2=1 , L3=1 , L4=1 Piso inicial: 0 - Techo Inicial 255 Intervalo: 256 N.Piso = 0 + 256 * 0 = 0 N. Techo = 0 + 256 * 1 / 5 - 1 = 50 Resultado de la normalización: Piso: 00000000 (0) -> 00000000 (0) Techo: 00110010 (50) -> 11001011 (203) Emisión: 00 C. underflow: 0 Compresión del caracter ‘A' – Contexto \b ● Contexto \b: A=1, I=1, N=1, O=1, V=1, R=1, EOF=1 Piso inicial: 0 - Techo Inicial 203 Intervalo: 204 N.Piso = 0 + 204 * 0 / 7 = 0 N. Techo = 0 + 204 * 1 / 7 - 1 = 28 Resultado de la normalización: Piso 00000000 (0) -> 00000000 (0) Techo: 00011100 (28) -> 11100111 (231) Emisión: 000 C. underflow: 0 FIUBA Organización de Datos - Curso Servetto 151 LZP ● Compresión de AAAAAANTANANARIVO: Compresión de Longitud 0: ● L0=2, L1=1, L2=1 , L3=1 , L4=1 L0=3, L1=1, L2=1 , L3=1 , L4=1 Piso inicial: 0 - Techo Inicial 231 Intervalo: 232 N.Piso = 0 + 232 * 0 = 0 N. Techo = 0 + 232 * 2 / 6 - 1 = 76 Resultado de la normalización: Piso: 00000000 (0) -> 00000000 (0) Techo: 01001100 (76) -> 10011001 (153) Emisión: 0 C. underflow: 0 Compresión del caracter ‘A' – Contexto A ● Contexto A: A=1, I=1, N=1, O=1, V=1, R=1, EOF=1 Contexto A: A=2, I=1, N=1, O=1, V=1, R=1, EOF=1 Piso inicial: 0 - Techo Inicial 153 Intervalo: 154 N.Piso = 0 + 154 * 0 / 7 = 0 N. Techo = 0 + 154 * 1 / 7 - 1 = 21 Resultado de la normalización: Piso 00000000 (0) -> 00000000 (0) Techo: 00010101 (21) -> 10101111 (175) Emisión: 000 C. underflow: 0 FIUBA Organización de Datos - Curso Servetto 152 LZP ● Compresión de AAAAAANTANANARIVO: Compresión de Longitud 0: ● L0=3, L1=1, L2=1 , L3=1 , L4=1 L0=4, L1=1, L2=1 , L3=1 , L4=1 Piso inicial: 0 - Techo Inicial 175 Intervalo: 176 N.Piso = 0 + 176 * 0 = 0 N. Techo = 0 + 176 * 3 / 7 - 1 = 74 Resultado de la normalización: Piso: 00000000 (0) -> 00000000 (0) Techo: 01001010 (74) -> 10010101 (149) Emisión: 0 C. underflow: 0 Compresión del caracter ‘A' – Contexto A ● Contexto A: A=2, I=1, N=1, O=1, V=1, R=1, EOF=1 Contexto A: A=3, I=1, N=1, O=1, V=1, R=1, EOF=1 Piso inicial: 0 - Techo Inicial 149 Intervalo: 150 N.Piso = 0 + 150 * 0 / 8 = 0 N. Techo = 0 + 150 * 2 / 8 - 1 = 36 Resultado de la normalización: Piso 00000000 (0) -> 00000000 (0) Techo: 00100100 (36) -> 10010011 (147) Emisión: 00 C. underflow: 0 FIUBA Organización de Datos - Curso Servetto 153 LZP ● Compresión de AAAAAANTANANARIVO: Compresión de Longitud 3: ● L0=4, L1=1, L2=1 , L3=1 , L4=1 L0=4, L1=1, L2=1 , L3=2 , L4=1 Piso inicial: 0 - Techo Inicial 147 Intervalo: 148 N.Piso = 0 + 148 * 6 / 8 = 111 N. Techo = 0 + 148 * 7 / 8 - 1 = 128 Resultado de la normalización: Piso: 01101111 (111) -> 00111100 (60) Techo: 10000000 (128) -> 10000011 (131) Emisión: C. underflow: 2 Compresión del caracter ‘N' – Contexto A ● Contexto A: A=3, I=1, N=1, O=1, V=1, R=1, EOF=1 Contexto A: A=3, I=1, N=2, O=1, V=1, R=1, EOF=1 Piso inicial: 60 - Techo Inicial 131 Intervalo: 72 N.Piso = 60 + 72 * 4 / 9 = 92 N. Techo = 60 + 72 * 5 / 9 - 1 = 99 Resultado de la normalización: Piso 01011100 (92) -> 00000000 (0) Techo: 01100011 (99) -> 11111111 (255) Emisión: 0111 C. underflow: 3 FIUBA Organización de Datos - Curso Servetto 154 Técnicas de Optimización de la Compresión FIUBA Organización de Datos - Curso Servetto 155 Block Sorting FIUBA Organización de Datos - Curso Servetto 156 Block Sorting • También llamada Burrows-Wheeler • Es una transformación que no comprime, incluso expande la fuente • Obtiene una permutación de caracteres para mejorar la localidad • La salida, con más localidad, es apropiada para ingresar al algoritmo Move to Front FIUBA Organización de Datos - Curso Servetto 157 Block Sorting • Se colocan todas las permutaciones de la fuente en una matriz, desplazando un carácter más en cada fila • Se ordenan alfabéticamente las filas • Se emiten la última columna y el índice de la fila correspondiente a la fuente original FIUBA Organización de Datos - Curso Servetto 158 Block Sorting Fuente: SALALALASARAS FIUBA Organización de Datos - Curso Servetto 159 Block Sorting Antitransformación • Se intenta reconstruir la matriz, primero se escribe la última columna S L L S L R A A A A S A A FIUBA Organización de Datos - Curso Servetto 160 Block Sorting Antitransformación • Se intenta reconstruir la matriz, primero se escribe la última columna • Se la reordena y se obtiene la primera FIUBA Organización de Datos - Curso Servetto A S A L A L A S A L A R L A L A L A R A S S S A S A 161 Block Sorting Antitransformación • Se intenta reconstruir la matriz, primero se escribe la última columna • Se la reordena y se obtiene la primera • Se concatena la última y la primera, se la reordena y se obtiene la segunda FIUBA A L S A L L A L L A R S A S L A S R L A A L A A L A A R A A S A S S A A S S A Organización de Datos - Curso Servetto 162 Block Sorting Antitransformación • Se intenta reconstruir la matriz, primero se escribe la última columna • Se la reordena y se obtiene la primera • Se concatena la primera y última, se la reordena y se obtiene la segunda • Se repiten los pasos hasta obtener toda la matriz FIUBA • La fila indicada por el índice es la fuente original Organización de Datos - Curso Servetto 163 Move To Front FIUBA Organización de Datos - Curso Servetto 164 Move To Front • Es una transformación que no comprime • Reduce la entropía de la fuente aumentando la probabilidad de unos símbolos por sobre la de otros • Sólo funciona bien si la fuente tiene mucha localidad FIUBA • El índice recibido desde el Block Sorting no es transformado Organización de Datos - Curso Servetto 165 Move To Front • Si su entrada es apropiada, su salida es mucho más adecuada para ser comprimida por algunos compresores estadísticos, y en algunos casos, por un compresor half coding • Tiene la propiedad de transformar repeticiones de cualquier carácter en números bajos. Cuanto más cerca la repetición, más bajo el número FIUBA Organización de Datos - Curso Servetto 166 Move To Front • Se codifica el alfabeto de la forma estándar (sin comprimir), por lo que a cada símbolo le corresponde un número. Se arma un array con los números. • Se van leyendo símbolos de la fuente según la codificación. Por cada símbolo que se lee, se emite su posición en el array, y se mueve ese símbolo a la posición 0 del array (el frente) FIUBA Organización de Datos - Curso Servetto 167 Move To Front SALALALASARAS, luego del BS se transforma en SLLSRAAAASAA-10 FIUBA Organización de Datos - Curso Servetto 168 Move To Front • Antitransformación: • Se vuelve a construir el array con las codificaciones del alfabeto • Se va leyendo a la entrada, donde cada lectura es una posición. Se emite el símbolo encontrado en la posición leída, y se pasa el símbolo al frente del array. FIUBA Organización de Datos - Curso Servetto 169 Modelo de Shannon FIUBA Organización de Datos - Curso Servetto 170 Modelo de Shannon • Es un compresor que utiliza como base el aritmético, emitiendo en cada paso según la distribución de probabilidad que corresponda al Match o Escape correspondiente • Se comporta muy bien si la fuente es la salida de un BS+MTF • Utiliza 6 modelos (o contextos) numerados, de los cuales 5 matchean con un solo símbolo • El único otro símbolo de esos modelos es el ESC FIUBA Organización de Datos - Curso Servetto 171 Modelo de Shannon • Los modelos 0 y 1 matchean con el símbolo 0, es decir, emiten M si el símbolo es 0, ESC si otro • El modelo 2 matchea con el símbolo 1 • El modelo 3 matchea con el símbolo 2 • El modelo 4 matchea con el símbolo 3 • El modelo 5 matchea con el resto de los símbolos FIUBA Organización de Datos - Curso Servetto 172 Modelo de Shannon • El modelo 0 se utiliza al principio, y cuando recién hubo un match para el símbolo 0 • El modelo 1 se utiliza en el resto de los casos • Cuando ocurre un ESC en un modelo, se busca en el modelo siguiente • Los modelos son dinámicos, por lo que actualizan las frecuencias en cada paso • Los modelos 0 y 1 nunca se utilizan en el mismo paso FIUBA Organización de Datos - Curso Servetto 173 Modelo de Shannon FIUBA Organización de Datos - Curso Servetto 174 Modelo Estructurado FIUBA Organización de Datos - Curso Servetto 175 Modelo Estructurado • Es un compresor que utiliza como base el aritmético, de la misma forma que el Modelo de Shannon • Se comporta muy bien si la fuente es la salida de un BS+MTF • Utiliza 9 modelos (o contextos) numerados, donde los más altos matchean con más cantidad de símbolos FIUBA Organización de Datos - Curso Servetto 176 Modelo Estructurado • Siempre se empieza del modelo 0 • Matches: FIUBA Organización de Datos - Curso Servetto 177 Modelo Estructurado FIUBA Organización de Datos - Curso Servetto 178 Comparación de Compresores • A la salida de BS+MTF, se pueden aplicar tres compresores que obtienen buenos resultados: • Modelo estructurado • Modelo de Shannon • Half Coding • Los tres se benefician de las apariciones del carácter 0 FIUBA Organización de Datos - Curso Servetto 179 Comparación de Compresores • Half Coding se beneficia más que los otros dos compresores con la abundancia de 0s. Los otros dos se benefician por igual • Si hay abundancia de caracteres de valores intermedios (por ejemplo 4, 7 o 20) el modelo de Shannon comprime peor que el estructurado FIUBA Organización de Datos - Curso Servetto 180 Algoritmos de Compresión Con Pérdida (Lossy) Compactación de imágenes: JPEG Compactación de vídeo: MPEG FIUBA Organización de Datos - Curso Servetto 181 Algoritmos de Compresión Con Pérdida (Lossy) • La naturaleza de los datos multimedia es brindar información directa a una persona. Las personas, tenemos límites en la percepción. • El cerebro humano compensa estas deficiencias, integrando la información. Así, podemos seleccionar la información que menos se percibe y eliminarla. • Los periféricos, transmiten información a otros periféricos, captando todos los datos enviados. • Para el humano, la pérdida de esta información es inapreciable, mientras que para un periférico es cuantiosa. FIUBA Organización de Datos - Curso Servetto 182 Algoritmos de Compresión Con Pérdida (Lossy) • Los archivos multimedia (de video) son muy “pesados” debido a su naturaleza. • Su representación más sencilla es la sucesión de cuadros, cada uno de los cuales se representa como una matriz de píxeles. • El video a color utiliza 8 bits por pixel para cada color RGB (Red, Green, Blue), 16 millones de colores en total. FIUBA Organización de Datos - Curso Servetto 183 Algoritmos de Compresión Con Pérdida (Lossy) • Para que el ojo humano observe movimiento continuo, se deben exhibir 25 cuadros/s. • Para una pantalla de 1024 x 768, teniendo 24 bits por pixel, necesito alimentar el monitor con 472 Mbps. • Un video de 2 horas, con esta tasa, ocuparía casi 400 Gb. FIUBA Organización de Datos - Curso Servetto 184 Algoritmos de Compresión Con Pérdida (Lossy) • Se necesitan técnicas de compresión (compactación en este caso) para el video. • En este tipo de técnicas, la codificación y la decodificación van a ser bastante asimétricas. • El archivo multimedia solo se codificará una vez y se decodificará muchas veces. • Al decodificar, el resultado será distinto al original hay pérdida de información FIUBA Organización de Datos - Curso Servetto 185 JPEG FIUBA Organización de Datos - Curso Servetto 186 JPEG • JPEG (Joint Photographic Experts Group) es un estándar para comprimir imágenes. • Se utiliza como parte del estándar MPEG para comprimir video. • Tiene 4 modos, pero nos ocuparemos del que se usa con video RGB de 24 bits. • Las tasas de compresión pueden ser entre 20:1 y 25:1 sin notar degradaciones importantes, mientras que en las técnicas sin pérdida podrían rondar los 10:1. FIUBA Organización de Datos - Curso Servetto 187 JPEG • Además de RGB, existe otra forma de representar el color con una señal de luminancia (brillantez) y dos de crominancia (color). • El ojo humano es mucho mas sensible a las señales de luminancia que a las de crominancia. Por esto, las dos últimas no tienen por qué transmitirse con tanta precisión. FIUBA Organización de Datos - Curso Servetto 188 JPEG (codificación) • 1er paso: Preparación de los bloques • Teniendo una imagen RGB de 640 x 480, con 24 bits por pixel. • Sabiendo que las señales de luminancia y crominancia producen mejor compresión, se calculan a partir de los valores de RGB. • Estas se llaman Y (luminancia), I y Q (crominancia) en el caso que veremos (NTSC). FIUBA Organización de Datos - Curso Servetto 189 JPEG (codificación) • 1er paso: Preparación de los bloques • Se construyen matrices individuales para Y, I y Q. Cada una con elementos dentro del intervalo 0 – 255 (8 bits). No se comprime nada hasta aquí. • Se promedian bloques cuadrados de cuatro pixeles en las matrices I y Q (quedando 320x240) • Esta reducción produce pérdidas, pero el ojo casi no lo nota debido a que es más sensible a la luminancia. FIUBA Organización de Datos - Curso Servetto 190 JPEG (codificación) • 1er paso: Preparación de los bloques • Se resta 128 a cada elemento de las 3 matrices para que el 0 quede a mitad del intervalo. • Se divide cada matriz en bloques de 8x8. FIUBA Organización de Datos - Curso Servetto 191 JPEG (codificación) • 2do paso: Transformación discreta del coseno • A cada uno de los bloques por separado se aplica la DCT. El resultado es una matriz de 8x8 coeficientes DCT. • El elemento DCT (0,0) es el valor promedio del bloque. • En teoría este paso no produce pérdidas, pero siempre existe un pequeño error de redondeo. FIUBA Organización de Datos - Curso Servetto 192 JPEG (codificación) • 2do paso: Transformación discreta del coseno • El valor promedio es el más alto del bloque, y el resto decae rápidamente a medida que se aleja del origen. FIUBA Organización de Datos - Curso Servetto 193 JPEG (codificación) • 3er paso: Cuantización • Se eliminan los elementos DCT menos importantes. Produce pérdidas. • Se divide cada elemento DCT de cada matriz 8x8 por un peso correspondiente a la misma posición, tomado de una tabla de cuantización. • La tabla no es parte del estándar, por lo que sus pesos pueden variar dependiendo del grado de pérdida/compresión que se desee dar. FIUBA Organización de Datos - Curso Servetto 194 JPEG (codificación) • 3er paso: Cuantización FIUBA Organización de Datos - Curso Servetto 195 JPEG (codificación) • 4to paso: Reducción del valor promedio • Redice el valor (0,0) de cada bloque, sustituyéndolo por su diferencia con el elemento (0,0) del bloque anterior. • Es de esperarse que el cambio entre un bloque y otro sea gradual, por lo que las diferencias serán pequeñas. FIUBA Organización de Datos - Curso Servetto 196 JPEG (codificación) • 5to paso: Linealización del bloque • Explora los elementos del bloque en zigzag, comenzando por el elemento origen. • Con esto, términos parecidos y tiras de ceros se obtienen juntos. FIUBA Organización de Datos - Curso Servetto 197 JPEG (codificación) • 6to paso: Compresión • Al resultado obtenido por la linealización, se le aplica un compresor tipo run-length para aprovechar seguidillas de valores repetidos. • A la lista de números que representan la imagen completa, se le aplica el método de compresión estadística de Huffman, para almacenar o transmitir los datos. FIUBA Organización de Datos - Curso Servetto 198 MPEG FIUBA Organización de Datos - Curso Servetto 199 MPEG • MPEG (Motion Pictures Experts Group) es un conjunto de estándares para comprimir video. • MPEG-1 está diseñado para obtener salidas con calidad videograbadora (352x240), tasa de 1.2 Mbps. • MPEG-2, del que nos ocuparemos, comprime video con calidad de difusión entre 4 y 6 Mbps. FIUBA Organización de Datos - Curso Servetto 200 MPEG • Esta técnica de compresión aprovecha los dos tipos de redundancia presente en los videos: • Redundancia espacial: se codifican los cuadros utilizando JPEG • Redundancia temporal: cuadros consecutivos suelen ser casi idénticos, muchas veces los cambios son pequeños • Por otro lado, se buscan resolver dos problemas: • Movimiento de objetos: imagen fija, objetos en movimiento • Movimiento del observador: imagen en movimiento FIUBA Organización de Datos - Curso Servetto 201 MPEG • La salida consiste en 3 tipos de cuadro: • Cuadros I (intracodificados): imágenes fijas independientes, codificadas por JPEG. • Cuadros P (predictivos): diferencias, bloque por bloque, respecto al cuadro anterior. • Cuadros B (bidireccionales): diferencias respecto al cuadro anterior y al siguiente. FIUBA Organización de Datos - Curso Servetto 202 MPEG • Cuadros I • Se codifica directamente una imagen por medio de JPEG como vimos anteriormente. • Resuelven la redundancia espacial en el video. • Son necesarios en forma periódica: • Para poder sintonizar en cualquier momento • En caso que algún cuadro contenga errores • Avance rápido y rebobinado FIUBA Organización de Datos - Curso Servetto 203 MPEG • Cuadros P • Codifican diferencias entre cuadros. Se buscan macrobloques, de 16x16 pixeles de luminancia y 8x8 de crominancias. • Cada macrobloque se codifica buscando uno igual o casi igual en el cuadro anterior. FIUBA Organización de Datos - Curso Servetto 204 MPEG • Cuadros P • El estándar MPEG no especifica cómo hacer la búsqueda, qué tan lejos buscar, ni qué tan exacta debe ser la coincidencia para identificar un match. • Si se encuentra un macrobloque, se codifica calculando la diferencia respecto al del cuadro anterior, utilizando JPEG. Se agrega, además, el vector de movimiento, que indica qué tanto se movió el macrobloque. • Si no hay coincidencia, se codifica el macrobloque con JPEG, tal como los cuadros I. • Ayuda a resolver el problema del movimiento de objetos entre cuadros consecutivos. FIUBA Organización de Datos - Curso Servetto 205 MPEG • Cuadros B • Similares a los P, pero permiten que el macrobloque se encuentre en el cuadro siguiente (que podría ser I o P). • Permite compensar mejor el movimiento, resolviendo el problema de movimiento del observador, presente en el video. • Para codificarlos, es necesario almacenar 3 cuadros en memoria (anterior, actual y futuro) • Los cuadros deberán almacenarse en orden de dependencia y no de exhibición. Será necesario el uso de buffers para reordenarlos al exhibirlos. FIUBA Organización de Datos - Curso Servetto 206 Referencias ● FIUBA A. S. Tanenbaum, "Sistemas Operativos Modernos, Segunda Edición", Prentice Hall. ISBN 0-13-031358-0, 976 páginas. Organización de Datos - Curso Servetto 207