Você está na página 1de 7

Compresso de dados

Introduo

Universidade Federal de So Carlos Centro de Cincias Exatas e de Tecnologia Departamento de Computao

COMPRESSO SEM PERDA MTODE DE HUFFMAN E MTODO DE LEMPEL ZIV

Compresso de dados o processo de codificar um corpo de informaes digitais dentro de uma representao menor, da qual a original pode ser reconstituda em momento posterior. As tcnicas de compresso de dados podem ser divididas em duas grandes famlias: com perda e sem perda (lossy e lossless data-compression). Se a informao pode sempre ser reconstituda exatamente sem qualquer distoro ou perda de informao, o processo denominado sem perda. Esse um contraste com a compresso com perda que sacrifica um pouco da integridade da informao em troca de um grande incremento na compresso. A compresso sem perda baseada em tcnicas que garantem uma cpia exata do fluxo de dados de entrada depois de um ciclo de compresso/expanso. Esse o tipo de compresso usada para armazenar registros de banco de dados, planilhas eletrnicas ou arquivos de processadores de textos. Em geral, a compresso de dados consiste em receber uma seqncia de smbolos e transform-la em uma seqncia de cdigos. Se a compresso for eficiente, o fluxo de cdigos resultante ser menor do que os smbolos originais. Finalidades As razes para que se comprimam dados so: Manuteno de mais dados on-line; Reduo de tempo necessrio transferncia de dados; Retardo na aquisio de mais discos; Reduo do nmero de fitas back-up.

Disciplina: Organizao e Recuperao de Informao Professor: Jander Moreira Turma: C Alunos: Andr Luiz Lyra Eduardo Okubo Ezequiel Fantin Deluca Marina Ferreira Alves R.A: 231037 R.A: 231258 R.A: 230731 R.A: 230863

Data de Entrega: 06/09/03

Dentre as tcnicas existentes para a compresso de dados podemos citar como exemplo: Supresso de brancos Em registros de tamanho fixo com informao textual, comum que boa parte do arquivo contenha registros completados com brancos que podem ser eliminados sem perda de informaes. A descompresso feita retornando-se os registros ao tamanho normal. O primeiro registro nunca comprimido para assinalar o tamanho original. Supresso de Repeties (Run Lenght) Os arquivos a comprimir podem ser de cdigo executvel, de texto e de dados. Neste ltimo caso, podem ocorrer vrias seqncias de repeties do mesmo caractere. Supondo-se a ocorrncia de N repeties do caractere K, pode-se substituir essa ocorrncia por 3 bytes.
<seqncia de escape><N><K>

Esta exigncia pode ser ilustrada por trs diferentes codificaes de trs smbolos, como dadas na seguinte tabela: Smbolo A B C Cdigo1 1 2 12 Cdigo2 1 22 12 Cdigo3 11 12 21

O primeiro cdigo no nos permite fazer distino entre AB e C, pois ambos so codificados como 12. O segundo cdigo no tem essa ambigidade, mas exige uma olhada frente, como em 1222: o primeiro 1 pode ser decodificado como A. O 2 seguinte pode indicar que A foi impropriamente escolhido, e 12 deve ter sido decodificado como C. A decodificao apropriada CB. Todos esses problemas surgem porque tanto o cdigo1 quanto o cdigo2 violam a propriedade de prefixo. Somente o cdigo3 pode ser decodificado, sem ambigidade, como lido. Para um cdigo timo mais duas estipulaes so especificadas: 1. O comprimento de palavra de cdigo para um dado smbolo m no deve exceder o comprimento da palavra de cdigo de um smbolo j menos provvel; 2. Em um sistema timo de codificao no deve haver pequenas palavras de cdigo no usadas, nem prefixos para palavras de cdigo mais longas, pois isso significaria que as palavras de cdigo mais longas teriam sido criadas desnecessariamente. Por exemplo, a seqncia de palavras de cdigo 01, 000, 001, 100, 101 para certo conjunto de cinco smbolos no tima, porque a palavra de cdigo 11 no usada em nenhuma parte; essa codificao pode ser transformada em uma seqncia tima 01, 10, 11, 000, 001.

Exemplo:
GOOOOOOOL => G~7OL

As vrias tcnicas de compresso de dados visam diminuir o comprimento mdio da palavra de cdigo, idealizando um cdigo timo (isto , uma atribuio de palavras de cdigo para smbolos) que dependa da probabilidade P com a qual um smbolo usado. Se um smbolo emitido com pouca freqncia, a ele atribuda uma palavra de cdigo longa. Para smbolos emitidos freqentemente, codificaes muito curtas so mais apropriadas. Algumas restries precisam ser impostas aos cdigos candidatos: 1. Cada palavra de cdigo corresponde a exatamente um smbolo; 2. A codificao deve satisfazer a propriedade de prefixo. Isso significa que nenhuma palavra de cdigo um prefixo de outra palavra de cdigo, evitando assim, ambigidades.

Existem muitos mtodos diferentes de compresso de dados que reduzem o tamanho da representao sem afetar a prpria informao. Para comparar a eficincia dos diferentes mtodos, quando aplicados aos mesmos dados, usamos uma medida chamada taxa de compresso, que definida pela relao: comprimento (entrada) comprimento (sada) comprimento (entrada) Ela expressa como uma porcentagem que indica a quantidade de redundncia removida a partir da entrada. Enfoque do trabalho Nesse trabalho abordaremos, com mais profundidade, dois importantes mtodos de compresso sem perda. So eles: Mtodo de Huffman Mtodo de Lempel Ziv

Compresso de Dados Sem Perda


Cdigo de Huffman Cdigo de Huffman um mtodo para codificar um texto de forma a obter uma compactao que seja tima dentro de certos critrios. A construo desse cdigo foi desenvolvida por David Huffman, que utilizou a estrutura de rvore binria, de forma a gerar um cdigo binrio. Supe-se que o texto seja composto por um conjunto de smbolos (ou caracteres). conhecida a freqncia com que cada smbolo aparece ao longo do texto. Deseja-se atribuir um cdigo a cada smbolo, de modo a compactar o texto todo. As restries impostas so aquelas j vistas anteriormente (propriedade de prefixo, etc). A rvore estritamente binria de Huffman possui as arestas rotuladas, que sero usadas na determinao de cada cdigo. Para cada n interno a aresta que conduz ao filho esquerdo rotulada com zero, enquanto o rtulo que conduz ao filho direito igual a 1. Cada smbolo est associado a uma folha da rvore. O cdigo de um determinado smbolo igual a seqncia dos rtulos das arestas, do caminho desde a raiz at a folha correspondente ao smbolo. Construo da rvore de Huffman O algoritmo que rege a construo da rvore de Huffman simples; definido pelos seguintes passos: 1. Determinao da freqncia de ocorrncia de cada smbolo; 2. Criao de uma Lista de Prioridades classificada em ordem crescente de freqncia de ocorrncia de cada smbolo, na qual cada n ser uma raiz de rvore binria com um smbolo e a freqncia correspondente; 3. Retirada, da Lista de Prioridades, dos dois primeiros ns e sua incluso como filhos, esquerdo e direito, respectivamente, de um n de agregao que no tenha smbolo, mas cuja freqncia de ocorrncia seja igual soma das freqncias de ocorrncia dos smbolos contidos em seus filhos; 4. Incluso, na Lista de Prioridades, do n de agregao assim criado; 5. Repetio dos passos 3 e 4 at que a Lista de Prioridades contenha um s n, que a raiz da rvore de Huffman;

6. Atribuio dos rtulos: 0 (zero) para cada aresta que conduz ao filho esquerdo de um n interno e 1 (um) para cada aresta que conduz ao seu filho direito; 7. Atribuio do cdigo correspondente a cada smbolo identificado pela trajetria obtida da raiz at a folha da rvore de Huffman que contm o smbolo. Gerar uma tabela de cdigos com o cdigo de cada smbolo. Codificao Para a codificao pelo mtodo de Huffman so necessrios os seguintes passos: 1. Identificao, na tabela de cdigos de Huffman, do cdigo correspondente ao smbolo a ser codificado; 2. Substituio do smbolo a codificar pelo cdigo correspondente; 3. Repetir os passos 1 e 2 para todos os smbolos a serem codificados, gerando, assim, uma seqncia de cdigos.

Para que haja uma melhor compreenso do Cdigo de Huffman, segue um exemplo que apresenta uma situao hipottica onde deseja-se codificar a seqncia BANANA. Os smbolos a considerar e suas respectivas freqncias esto dispostos na tabela abaixo: SMBOLO Freqncia B 1 N 2 A 3

Lista de Prioridades rvore de Huffman construda com base no algoritmo apresentado 6


0 1

3
0 1

3 A

Decodificao Para a decodificao pelo mtodo de Huffman so necessrios os seguintes passos: 1. Escolha do primeiro bit do cdigo como bit corrente; 2. Descida de um nvel da rvore de Huffman, a partir da raiz, de acordo com o valor do bit corrente (0 => filho esquerdo ou 1 => filho direito) e atribuio ao bit corrente do prximo bit da string de bits do cdigo a decodificar; 3. No caso de ser atingida uma folha da rvore de Huffman, deve-se fazer a substituio dos bits correspondentes trajetria at a folha pelo caractere contido nessa folha; 4. Repetio dos passos 2 e 3 at que termine a string de bits do cdigo a decodificar.
1 B 2 N

Tabela de Cdigos

SMBOLO Cdigo

B 00

N 01

A 1

Seguindo os passos necessrios para a codificao, o seguinte resultado obtido: 001011011. Uma medida fundamental da qualidade do cdigo o comprimento do texto codificado, isto , o nmero de dgitos binrios na codificao. Nesse caso, o comprimento de 9 bits. Enquanto a seqncia BANANA possui comprimento equivalente a 48 bits (cada smbolo corresponde a 8 bits).

Devemos citar que existe uma variao da codificao de Huffman, chamada Codificao de Huffman Adaptativa ou Huffman Adaptativo. Essa tcnica, idealizada por Robert Gallager e melhorada por Donald Knuth, foi criada para que se pudesse usar a compresso de Huffman em casos onde no se conhecem, previamente, as freqncias de ocorrncia de cada caractere no texto. Nesse caso, devemos atualizar constantemente (a cada nova entrada) as freqncias de ocorrncia de caracteres na rvore, o que, em alguns casos, implica numa reestruturao da mesma. Essa estrutura atende quelas propriedades que j vimos no mtodo de Huffman: Os smbolos que aparecem com mais freqncia tm que estar mais prximos da raiz (de modo a gerar uma string de cdigos menor para smbolos mais freqentes); Os ns com freqncias maiores devem estar posicionados, na rvore, sempre mais acima e mais direita do que os ns com freqncias menores. Modelo estatstico Encontramos caractersticas semelhantes s de Huffman em outros mtodos de compresso sem perda. Podemos citar, como exemplo, Codificao Aritmtica e Shannon-Fano. O mtodo de Huffman, bem como esses outros mtodos citados acima, so ditos estatsticos por seguirem um modelo estatstico de distribuio de smbolos no texto a codificar. Algoritmos de compresso estatsticos codificam smbolos isolados como strings de cdigo (bits) de comprimento varivel. A forma mais simples de modelagem estatstica usa uma tabela de probabilidades de ocorrncia de smbolos na seqncia a codificar. Smbolos que aparecem com maior freqncia no texto so codificados com palavras de cdigo menores e, por sua vez, smbolos que aparecem com pouca freqncia recebem uma palavra de cdigo maior. Modelo baseado em dicionrio Algoritmos de compresso baseados em dicionrio codificam strings de smbolos, de comprimentos variveis, como cdigos individuais (tokens). Esses cdigos formam um ndice para um dicionrio de frases. Essa uma famlia de algoritmos que trabalha na converso de cadeias de smbolos de tamanhos variados em smbolos nicos.

Em resumo, os mtodos de compresso baseados em dicionrio so caracterizados principalmente por: No necessitarem conhecer a estatstica dos dados a comprimir; Utilizarem seqncias de smbolos de comprimento varivel; Utilizarem seqncias de cdigos de comprimento fixo ou at mesmo varivel. Os algoritmos que se enquadram nesse modelo deram origem aos seguintes programas de compresso: PKZIP, ZOO, ARC, ARJ, GIF entre outros. Os trabalhos de LEMPEL & ZIV so os mais representativos dentre os algoritmos de compresso baseados em dicionrio. Cdigo de LempelZiv (LZ) No final da dcada de 70 Jacob Ziv e Abraham Lempel desenvolveram dois algoritmos para compresso de dados: LZ77 e LZ78. Eles so compressores que, sempre que uma frase repetida, substituem a ocorrncia original da frase por uma referncia. Esses algoritmos utilizam duas reas de trabalho: Dicionrio => onde ficam armazenadas informaes codificadas; rea de Pesquisa => onde fica a string a comprimir ou descomprimir. O mtodo consiste em identificar, na rea de pesquisa, a maior seqncia de smbolos armazenada no dicionrio e substitu-la, na compresso, por um cdigo. Na descompresso os cdigos da rea de pesquisa devem ser substitudos pelas seqncias de smbolos correspondentes do dicionrio. O que diferencia os dois algoritmos em questo , basicamente, a estrutura do dicionrio. LZ77 A estrutura principal deste algoritmo consiste em uma janela que, conceitualmente, desliza sobre a seqncia a ser codificada, substituindo seqncias de smbolos por ponteiros para um dicionrio. Esta janela consiste de duas partes: a primeira contm os ltimos smbolos que foram codificados e a segunda os prximos smbolos a serem codificados que tambm chamada de rea de previso.

10

Figura janela deslizante Linha preta - seqncia de smbolos a ser codificada Linha vermelha - 1 parte da janela: smbolos que j foram codificados - dicionrio Linha azul - 2 parte da janela: smbolos a serem codificados rea de previso

Devemos citar que cinco anos mais tarde, em 1982, com contribuies de Storer e Szymanski, o algoritmo LZ77 foi aprimorado. essa variante damos o nome de LZSS. A principal alterao desse algoritmo foi a adio de uma estrutura de dados, de forma a criar o dicionrio usando uma rvore binria, visando diminuir o tempo de busca. LZ78 Ao contrrio do algoritmo LZ77, no algoritmo LZ78, no existe uma janela que se desloca sobre o arquivo, dentro da qual as seqncias so procuradas. A referncia pode ser feita a qualquer seqncia j vista anteriormente. O LZ78 mantm um dicionrio de frases j ocorridas no arquivo, que comea praticamente vazio. Por definio ele comea com um smbolo bem simples: NULL. Em cada passo criada uma nova frase, constituda de uma frase j presente no dicionrio e um caracter representado explicitamente. Desta forma, uma dupla (N,C) gravada no arquivo compactado, sendo N o nmero da frase j ocorrida e C o prximo caracter. Esta dupla significa: copie a frase n seguida do caracter c. O exemplo a seguir mostra o resultado da codificao da seqncia de caracteres ABBCBCABA: Posio Caracter 1 A 2 B 3 B 4 C 5 B 6 C 7 A 8 B 9 A

Normalmente o dicionrio contm alguns milhares de palavras e a rea de previso algumas dezenas. Cada smbolo do arquivo compactado constitudo de uma tripla, <a,b,c>, onde o primeiro componente (a) indica quanto voltar no texto j decodificado para encontrar a prxima frase, o segundo (b) componente armazena o comprimento dessa frase, e o terceiro (c) d o prximo caractere da entrada. Como o objetivo a maior compresso possvel de dados, deve-se procurar substituir por um ponteiro a maior seqncia de smbolos. A taxa de compresso deste mtodo bem alta para vrios tipos de dados, mas a codificao muito demorada, visto que existem vrias comparaes a serem feitas entre a rea de previso e a janela de dicionrio. J a decodificao bem simples. Ilustrao:

DICIONRIO 1 2 3 4 5 A B BC BCA BA

CODIFICAO (0,A) (0,B) (2,C) (3,A) (2,A)

11

12

LZW Este algoritmo uma variao do LZ78 desenvolvida por Terry Welch em 1984. O algoritmo LZW o mais utilizado em todos os formatos que utilizam a compactao baseada em dicionrio. A variao introduzida foi iniciar o dicionrio no apenas com a string nula, mas tambm com todas as frases que contm apenas um smbolo no alfabeto que est sendo utilizado. Assim, se o alfabeto utilizado consiste dos smbolos a0, a1, a2, ..., aj, o dicionrio seria pr-carregado com as J frases, sendo a primeira a0, a segunda a1, e assim sucessivamente. Por exemplo se o alfabeto utilizado for o cdigo ASCII, o dicionrio ser carregado inicialmente com os caracteres correspondentes ao cdigo 0, cdigo 1, cdigo 2, e assim sucessivamente at o caracter correspondente ao cdigo 255. Para se obter a codificao atravs do mtodo LZW devem ser seguidos os seguintes passos: 1. Inicialize o dicionrio com todas as frases de comprimento igual a 1; 2. Procure, no cdigo a ser comprimido, pelo bloco W mais longo que tenha registro no dicionrio; 3. Codifique W com seu ndice marcado no dicionrio; 4. Adicione W, seguido pelo prximo caractere da seqncia, ao dicionrio; 5. Volte ao passo 2 .

Por exemplo, se desejarmos codificar a seqncia ABBABABAC: 1 2 3 Posio 1 Caractere A A B C 2 B 3 B 4 A 5 B 6 A 7 B 8 A 9 C

DICIONRIO 4 5 6 7 8 AB BB BA ABA ABAC

A seqncia codificada ficaria, ento: A 1 B 2 B 2 AB 4 ABA 7 C 3

Para decodificar o cdigo gerado basta trocar os ndices pelas frases a eles associadas. OBS: Os ndices do dicionrio foram representados em decimais apenas para facilitar a compreenso dos esquemas. Na verdade, eles so os cdigos binrios estudados anteriormente. BIBLIOGRAFIA
FERRAZ, INHAUMA NEVES. Programao com Arquivos, 1 edio, Ed. Manole, 2002. DROZDEK, ADAM. Estrutura de Dados e Algoritmos em C++, 1 edio, Ed. Thomson Pioneira, 2002. NAM PHAMDO (State University of New York). Lossless Data Compression, http://www.data-compression.com/lossless, 09/2002.
ULISSES KENDI HAYASHIDA. MAC 499 TRABALHO DE FORMATURA SUPERVISIONADO,

http://www.linux.ime.usp.br/~cef/mac499-01/monografias/ulisses/, 09/2002.

13

14

Você também pode gostar