Você está na página 1de 66

UNIVERSIDADE FEDERAL DE GOIS ESCOLA DE ENGENHARIA ELTRICA E DE COMPUTAO

PROGRAMA PARA COMPACTAO DE DADOS UTILIZANDO CDIGO DE HUFFMAN

Diego Vidier Oda Arruda Rodrigo Silva Goes Orientador: Prof. Dr. Getlio Antero de Deus Jnior

Goinia 2003 DIEGO VIDIER ODA ARRUDA RODRIGO SILVA GOES

PROGRAMA PARA COMPACTAO DE DADOS UTILIZANDO CDIGO DE HUFFMAN

Dissertao apresentada ao Curso de Engenharia de Computao da Escola de Engenharia Eltrica e de Computao da Universidade Federal de Gois, como parte para aprovao na disciplina de Estgio e Projeto Final. rea de Concentrao: Compactao de Dados. Orientador: Prof. Dr. Getlio Antero de Deus Jnior.

Goinia 2003

DIEGO VIDIER ODA ARRUDA RODRIGO SILVA GOES

PROGRAMA PARA COMPACTAO DE DADOS UTILIZANDO CDIGO DE HUFFMAN

Projeto Final defendido e aprovado em oito de janeiro de dois mil e quatro, pela Banca Examinadora constituda pelos professores:

______________________________________ Prof. Dr. Getlio Antero de Deus Jnior Presidente da Banca ______________________________________ Prof. Dr. Reinaldo Gonalves Nogueira 1 membro da Banca ______________________________________ Prof. Msc. Carlos Galvo Pinheiro Junior 2 membro da Banca

Deus e aos nossos pais.

AGRADECIMENTOS

Universidade

Federal

de

Gois,

pelo

aprimoramento

proporcionado nas lides da Engenharia de Computao. Aos coordenadores, professores e funcionrios da Escola de Engenharia Eltrica e de Computao, pelo ambiente de estudos e meios colocados disposio. Aos companheiros de turma, pela camaradagem e amizade. Em especial ao nosso professor e orientador Getlio Antero de Deus Jnior pela dedicao, incentivo e compreenso. nossa famlia que anonimamente vem ao longo dos anos sendo o suporte sem o qual este no seria possvel. Ao nosso Grandioso Pai Celestial.

SUMRIO Pg. RESUMO........................................................................ 07 ABSTRACT.................................................................... 08 INTRODUO.............................................................. 01 CAPTULO 1 ................................................................. 02 PREMILINARES TERICAS..................................... 02 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 Histrico........................................................................... 02 Cdigo de Huffman.......................................................... 07 Estrutura de Dados........................................................... 17 Compactao ................................................................... 21 Tcnicas de Compactao............................................... 24 Compactao Estatstica ................................................ 34 Compactao Fixa versus Compresso Auto-adaptvel. 35 O cdigo de Lempel-Ziv ................................................ 36 Codificao Lempel-Ziv ................................................ 41 CAPTULO 2 ............................................................... 45 O PROBLEMA.............................................................. 45 2.1 2.2 2.3 2.4 2.5 Introduo........................................................................ 45 Proposta para implementao do compactador................ 48 Desempenho do compactador implementado.................. 53 Testes realizados.............................................................. 53 Aplicaes....................................................................... 55 CONCLUSO............................................................... 57 REFERNCIAS BIBLIOGRFICAS........................ 58

RESUMO impossvel pensarmos nos dias de hoje num mundo computacional sem pensarmos nas formas de armazenamento de dados. Isto implica articularmos todos os aspectos do armazenamento. Desde como gravaremos fisicamente, como transmitiremos estes dados de formas mais eficientes at em formas de compactao destes dados. Neste trabalho, ressaltamos o aspecto particular da compactao de dados, que busca mecanismos para reduzir o tamanho dos dados utilizando alguma lgica matemtica adequada ao tipo de aplicao considerada, de tal forma que possamos na outra ponta obtermos os dados originais utilizando a lgica inversa. Neste sentido, tratamos especificamente da compactao de arquivos textos, dando uma noo geral sobre compactadores e sua histria, sobre de que se trata o Cdigo de Huffman e finalmente permeando nossa experincia na implementao desse cdigo e nossas concluses empricas, comparando inclusive com outros cdigos eficientes como Lempel-Ziv, expressos atravs de ndices de compactao.

ABSTRACT It is impossible think nowadays in a computational world without think in the ways of data storing. It means to explore every aspect of storing. Since how phisically we record it, how eficientily transmit these data until ways of data compression. In this work, we hilight especificaly this aspect, the data compression, wich looks for mechanisms to reduce these data length using some mathematical logic that fits to the type of considered aplication, in a way that we are capable on the other side get the original datas by taking an inverse logic. On this way, we treat especificaly of text file compression, giving a general explanation about compactors and its history, as what Huffman Code talk about and finaly exchaging our implementation experience and our empirical conclusions, comparing e with another eficient codes like LempelZiv.

INTRODUO
A compactao consiste basicamente numa forma de

armazenamento reduzido de um conjunto de dados. Primeiramente, abordaremos a evoluo da comunicao de dados tratando dos cdigos que foram desenvolvidos para que esta comunicao fosse possvel. Permearemos desde cdigos primitivos como, Cdigo Morse e Baudot, at os cdigos modernos. Faremos um estudo detalhado sobre Cdigo de Huffman, que o tema central de nosso trabalho, e suas aplicaes confrontando-o com outros cdigos existentes como o de Lempel-Ziv. Aprofundamos tambm nosso estudo sobre Estruturas de Dados, tratando especificamente sobre rvores binrias, estrutura imprescindvel na construo do Cdigo de Huffman. Em seguida, apresentamos alguns conceitos relativos a compresso e compactao de dados. Separando conceitualmente a definio destes termos, inclusive com o esboo de algumas tcnicas de compresso. No captulo, apresentamos a proposta de implementao do algoritmo de Huffman, para demonstrarmos que ele um algoritmo timo para caracteres. Consideramos vrios aspectos do compactador e viabilizamos uma soluo para a compactao de arquivos tipo texto. Com a utilizao de arquivos-entradas de prova levantamos e respondemos algumas perguntas realizados. Alm disso algumas consideraes a respeito do desempenho e discusso sobre ndices de compactao foi realizado.

10

CAPTULO 1
PREMILINARES TERICAS 1.1 - Histrico A comunicao de dados constitui o processo de comunicao de informaes em estado binrio entre dois ou mais pontos. s vezes, a comunicao de dados chamada de comunicao de informtica, porque a maioria das informaes trocadas hoje em dia transferida entre dois ou mais computadores ou entre computadores e terminais, impressoras ou outros dispositivos perifricos. Os dados podem ser elementares como os smbolos binrios 1 e 0, ou complexos como os caracteres representados pelas teclas em um teclado de mquina de escrever. Em todo caso, os caracteres ou smbolos representam informaes [1]. O campo de comunicao de dados representa uma das tecnologias de mais rpida evoluo. Utilizando semicondutores especializados desenvolvidos para realizar o processamento de sinais e a compactao, esto sento desenvolvidos vrios aplicativos de multimdia que orientam a comunicao de dados em direo ao transporte de informaes, dados e vdeo. importante entendermos a comunicao de dados por causa de sua significao no mundo de hoje. A comunicao de dados usada comumente em negcios e est sendo cada vez mais empregada tambm em ambientes domsticos. Quer seja a transmisso de informaes de um computador central para mquina de um caixa eletrnico, a seleo de um programa de TV a cabo no sistema "pay-per-view" ou o download de um videogame desde um BBS para um computador pessoal, a comunicao de dados est se

11

transformando em uma parte integrante de nossas atividades dirias. Na realidade, muitos leitores dificilmente conseguiro passar um dia interiro sem se beneficiarem de alguma atividade executada ou aperfeioada pelo uso da comunicao de dados. Quanto mais moderna uma sociedade, mais ela depende da comunicao de dados [1]. A comunicao de dados moderna envolve o uso de aparelhos eltricos ou eletrnicos para transmisso de informaes sob a forma de smbolos e caracteres entre dois pontos. Pelo fato da eletricidade, as ondas de rdio e as ondas luminosas serem todas formas de energia eletromagntica, poderamos afirmar ainda sem grande exagero que as primeiras formas de comunicao, como os sinais de fumaa das fogueiras dos ndios americanos ou a reflexo da luz solar em espelho tambm eram formas do mesmo tipo de comunicao de dados. Para levar essa idia mais adiante, imagine as nuvens de fumaa como smbolos discretos, exatamente como os smbolos usados nos atuais sistemas de comunicao. A descoberta e a utilizao da eletricidade introduziram muitas possibilidades novas para os cdigos de comunicao. Uma das primeiras propostas, apresentada em uma revista escocesa em 1753, era simples mas teve implicaes profundas para o hardware. Essa idia era a de estender 26 fios paralelos de uma cidade outra, um fio para cada letra do alfabeto. Um inventor suo construiu um sistema prottipo baseado nesse princpio de 26 fios, mas a tecnologia de fabricao de fios nessa poca eliminou a possibilidade de uso srio dessa idia. A complexidade de estender 26 fios para denotar as 26 letras do alfabeto indicava a necessidade de uma tcnica mais eficiente [1]. Em 1833, Carl Friedrick Gauss usou um cdigo baseado em uma matriz 5 por 5 de 25 letras (as letra I e J eram combinadas), para enviar mensagens pela deflexo de uma agulha para a direita ou esquerda de uma a

12

cinco vezes. O primeiro conjunto de deflexes indicava a linha e o segundo indicava a coluna. Essa tcnica pode ser considerada equivalente a especificar uma coluna e uma linha para denotar uma letra, permitindo o uso de uma nica linha em lugar de 26 linhas. Um dos desenvolvimentos mais significativos em comunicao de dados aconteceu no sculo XIX, quando o americano Samuel F. B. Morse inventou o telgrafo eltrico. Embora outros inventores tenham trabalhado na idia de usar eletricidade para se comunicarem, a inveno de Morse eram sem dvida a mais importante, porque ele juntou a mente humana (a inteligncia) com o equipamento de comunicao, com a decodificao baseado na capacidade auditiva da pessoa que recebia a mensagem, e tambm de seu conhecimento do cdigo desenvolvido por Morse [1]. Quando a tecla do telgrafo na estao A era pressionada, a corrente eltrica flua pelo sistema e o induzido na estao B era atrado para a bobina, emitindo um sinal sonoro medida que atingia o ponto de parada. Quando a tecla era liberada na estao A, ela abria o circuito eltrico e o induzido do receptor na estao B era forado para sua posio aberta por uma mola, atingindo o outro ponto de parada e emitindo um rudo um pouco diferente. Assim o receptor do telgrafo emitia dois rudos distintos. Se o tempo entre cliques sucessivos do receptor era curto, ele representava um ponto; se era mais longo, representava um trao. O operador de transmisso convertia os caracteres das palavras de uma mensagem a ser enviada em uma srie de pontos e traos. O operador receptor interpretava esses pontos e traos como caracteres; assim, as informaes eram transmitidas do ponto A para o ponto B. Quando Morse desenvolveu seu cdigo, diz a lenda que ele examinou a quantidade de tipos nas caixas que uma tipografia usava para armazenar caracteres ingleses e dgitos. Morse atribuiu cdigos curtos a

13

caracteres e dgitos que ocorriam com menor freqncia. Isso explica por que foi atribudo um ponto letra E, o carter usado mais freqentemente no idioma ingls, e por que foi atribudo um trao letra T, o segundo carter de uso mais freqente. Morse desenvolveu o telgrafo inicialmente em 1832, mas foi somente bem mas tarde que ele demonstrou seu uso com sucesso. A demonstrao mais conhecida ocorreu em 1844, quando Morse transmitiu por fios de Washington para Baltimore a mensagem: "Deus seja louvado!". Tendo em vista que a entrega de correspondncia pelo Pony Express era o meio de comunicao tpico antes do telgrafo, esse mtodo muito mais veloz logo se tornou um sucesso. O equipamento era simples e rudimentar: a tecla e o receptor acstico continham cada um apenas uma pea mvel. A fora e a fraqueza do sistema (e sua nica complexidade real) eram a mente humana - os operadores de transmisso e recepo. Na poca da guerra civil americana, uma linha de telgrafo se espalhou pelo continente, cruzando as pradarias e os desertos para conectar a Califrnia ao restante dos Estados Unidos. Foi a partir dessa inovao tecnolgica histrica, ou seja, a criao do telgrafo, que a Companhia Telegrfica da Unio Oeste (do ingls: Western Union Telegraph Company) tornou-se conhecida. Na poca em que o telefone foi inventado, cerda de 20 anos depois, a indstria do telgrafo era grande, com muitas empresas fornecendo servios para quase todas as cidade e vilas nos Estados Unidos. Em 1866, o telgrafo conectava as naes do mundo, com a instalao do cabo de transatlntico entre os Estados Unidos e a Frana. A importncia do telgrafo de Morse no apenas histrica. Boa parte da terminologia que se desenvolveu em torno do sistema Morse ainda usada atualmente. Por exemplo, considere os termos "marca" e "espao". Se

14

um dispositivo fosse organizado de modo que o papel se movimentasse continuamente sob uma caneta presa ao induzido do receptor telegrfico, seria feita uma marca no papel quando o induzido fosse atrado para a bobina. Poderamos fazer referncia ao estado de fluxo de corrente na linha, como estado de marcao, e ao estado sem fluxo de corrente na linha como estado de espao. Note que isso resulta em um dispositivo de dois estados, que pode ser considerado o precursor do sistema binrio usado para transferir informaes e para controlar a operao dos computadores. Os padres mundiais para comunicao da dados de hoje ainda utilizam os termos marca e espao, com a condio de fluxo decorrente no canal de transmisso sendo chamada condio de marcao. O mais importante da terminologia oriunda do princpio de operao do telgrafo foi o sistema de comunicao de dois estados. O fio telegrfico (canal) entre os operadores encontra-se em um destes dois estados: ou a corrente est fluindo ou no. Essa estrutura simples tem sido repetida continuamente no desenvolvimento de sistemas de comunicao de dados. Um sistema de comunicao de dois estados o mais simples, o mais fcil de construir e o mais confivel. Os dois estados podem ser ligado e desligado (como no telgrafo), mais e menos (com o fluxo de corrente em sentidos opostos), claro e escuro ( como ao acender e apagar uma lanterna para transmitir cdigo), 1 e 0 (o conceito usado nos computadores) ou alguma outra estrutura com apenas dois valores possveis. Um sistema de dois estados ou de dois valores chamado de "sistema binrio".

15

1.2 - Cdigo de Huffman 1.2.1 - Cdigos Os nmeros 0 e 1 so smbolos do sistema binrio. Um dgito binrio comunente chamado um bit. As mudanas de linha individuais em dados digitais (como marca e espao) so chamadas bits, e cada bit recebe a atribuio do valor 0 ou 1 [1]. O sistema binrio emprega a notao posicional da mesma maneira que o conhecido sistema decimal, exceto pelo fato de cada posio ter somente dois valores possveis, em vez de 10. Podemos definir potncias de dois no sistema posicional binrio, no qual o peso relativo de cada posio duas vezes o peso da posio imediatamente direita. Os computadores so mais eficientes se seus caminhos e registradores internos tiverem o comprimento igual a alguma potncia de dois (2 bits, 4 bits, 8 bits, 16 bits e assim por diante). Um agrupamento comumente usado o de 8 bits. Um grupo de 8 bits chamado um byte ou um octeto. Durante o perodo inicial da informtica, dos anos 50 aos anos 70, foram usados agrupamentos diferentes de bits para formar um caractere de computador. A arquitetura interna dos computadores desenvolvidos durante esse perodo utilizava entre cinco e doze bits para definir caracteres nicos ou bytes de computador. A falta de padres sobre o nmero de bits que representava um byte resultou em diversos padres sobre o nmero de bits que representaes usarem o termo "octeto" em sua literatura para fazer referncia a um agrupamento de oito bits. Embora quase todos os computadores modernos sejam projetados para grupar oito bits em um byte, a

16

maioria das organizaes que criam padres continua a usar o termo para fazer referncia a um grupo de oito bits. Uma caracterstica comum dos sistemas de comunicao o uso de um dispositivo inteligente para converter um caractere ou smbolo em sua forma codificada e vice-versa. No sistema Morse, os "dispositivos" inteligentes eram os operadores de telgrafo que convertiam os caracteres em pontos e traos. Operadores de telgrafo qualificados sempre estavam em falta, e o trabalho era difcil e exaustivo. Por essa razo, tornou-se necessrio criar um meio eltrico ou mecnico de codificar os caracteres. Entretanto, era essencialmente impossvel automatizar as operaes de transmisso e recepo, em virtude da durao varivel dos pontos e traos no cdigo Morse e do fato de que os cdigos correspondentes aos caracteres eram formados por diferentes quantidades de pontos e traos. Assim, surgiu a necessidade de um cdigo que tivesse o mesmo nmero de elementos de sinalizao de igual durao para cada caractere. Cdigos so interpretaes padres (combinadas com antecedncia) entre elementos de sinalizao e caracteres. Os cdigos usados em sistemas de comunicao de dados j esto definidos, e o conjunto de cdigos incorporado ao equipamento. Provavelmente, o nico momento em que o usurio poderia ter necessidade de lidar com cdigos seria quando estivesse criando a interface entre duas mquinas (como computadores e impressoras) de fabricantes diferentes. Caracteres so letras, numerais, os espaos, os sinais de pontuao e outros sinais e smbolos em um teclado. Os sistemas de comunicao usam caracteres de controle que no so impressos, mas esses caracteres tambm devem ser codificados. Alguns desses caracteres de controle (por exemplo, os caracteres de retorno de carro ou tabulao) tambm esto presentes no

17

teclado, embora muitos no estejam. No caso de muitos caracteres de controle no localizados diretamente em um teclado, o usurio pode digitar seus cdigos no teclado pressionando certos pares de teclas. Por exemplo, a ao de pressionar a tecla de controle (Ctrl) e a tecla G ao mesmo tempo (Ctrl + G) resulta no cdigo de tecla no-imprimvel BEL, que pode ser usado dentro de um programa para transmitir um alarme auditivo pessoa que opera um terminal de computador ou um computador pessoal. Um elemento de sinalizao algo enviado atravs de um canal de transmisso usado para representar um caractere. Assim os pontos e traos (ou marcas e espaos) do cdigo Morse so elementos de sinalizao. As definies de caracteres e elementos de sinalizao ilustram o motivo pelo qual as mquinas e as pessoas precisam de modos diferentes para representar informaes. As pessoas reconhecem com rapidez e confiabilidade os caracteres impressos por suas formas distintas, mas difcil e dispendioso uma mquina fazer o mesmo. Por outro lado, as mquinas podem manipular com facilidade longas seqncias de elementos de sinalizao de dois estados, como marcas e espaos ou uns e zeros, mas difcil uma pessoa conseguir o mesmo com alguma preciso.

1.2.2 - Cdigo de Baudot O cdigo de Morse era inadequado para codificao e decodificao por mquina, devido aos problemas causados pelos comprimentos variveis dos cdigos correspondentes aos caracteres. No incio do sculo XX, quando se desenvolveu o interesse na substituio de operadores de telgrafo humanos por mquinas, j existiam vrios cdigos adequados. O mais proeminente desses cdigos havia sido inventado na dcada de 1870 por um

18

francs chamado Emile Baudot. Tendo em vista que o cdigo de Baudot, usava o mesmo nmero de elementos de sinalizao (marcas e espaos) para representar cada caractere, ele era mais apropriado para codificao e decodificao por mquina [1]. Infelizmente, o nmero de elementos de sinalizao se limitava a cinco, em conseqncia de problemas de sincronizao dos dispositivos eletromecnicos. O cdigo de cinco bits s podia gerar 32 combinaes possveis. Esse cdigo no era suficiente para representar os 26 caracteres do alfabeto, os 10 dgitos decimais, os sinais de pontuao e o caractere de espao. Para superar essa limitao, Baudot usou dois caracteres de controle de deslocamento - o deslocamento de letras (LTRS) e o deslocamento de figuras (FIGS) - para permitir ao conjunto de cdigos representar todos os caracteres que pareciam necessrios na ocasio. Os cdigos de deslocamento no representam caracteres imprimveis; em vez disso, os cdigos selecionam um entre dois conjuntos de caracteres, cada composto por 26 a 28 caracteres. Embora a inveno de Baudot no tenha revolucionado imediatamente a telegrafia (devido dificuldade que os operadores humanos tinham para enviar cdigos de igual comprimento), ela forneceu a base para o desenvolvimento posterior do aparelho de telex.

1.2.3 - Cdigos Modernos O cdigo de Baudot e suas variaes foram a espinha dorsal da comunicao por quase meio sculo, mas claramente deixavam muito a desejar. O pessoal da indstria jornalstica considerou um problema a falta de diferenciao entre letras maisculas e minsculas. Os editores de jornais

19

inventaram um cdigo de seis nveis para designar a diferena entre letras maisculas e minsculas. Esse era apenas um exemplo da necessidade geral. A comunicao moderna exigia um cdigo que pudesse representar todos os caracteres imprimveis e ainda deixar espao para operaes de verificao de erros e formatao. Considerando-se as operaes de formatao, um cdigo deve admitir os caracteres de avano de linha e retorno de carro, bem como o avano de formulrio e a tabulao horizontal e vertical, porque o uso desses caracteres permite que as operaes de terminal sejam conduzidas medida que ocorrem. O cdigo tinha de tornar possvel a decodificao sem depender da recepo correta de transmisses anteriores, e tambm tinha de permitir a decodificao por mquina. Talvez o mais importante de tudo, o novo cdigo precisava ser expansvel [1]. Durante a dcada de 1960, foram desenvolvidos vrios cdigos de transmisso de dados. A maioria deles caiu no esquecimento, restando trs cdigos predominantes: - O CCITT International Alphabet N 2 um cdigo isolado de cinco bits que ainda usado para transmisso de telex. - O EBCDIC (do ingls: Extended Binary-Coded-Decimal Interchange Code), desenvolvido pela IBM, usado principalmente para comunicao sncrona em sistemas conectados a computadores de grande porte (mainframes). - O cdigo ASCII (do inlgs: American Standard Code for information Interchange) foi definido pelo ANSI (do inlgs : American National Standards Institute) nos Estados Unidos e pela ISO (do ingls: Internacional Organization form Standardization) em todo o mundo.

20

Quando surge uma necessidade clara de padronizao, os padres passam a existir de duas maneiras. Em um modo um nico fabricante (em especial um dominante) pode definir um padro para seus prprios produtos, e o restante da indstria pode segui-lo. Foi isso o que a IBM fez. Ela criou o cdigo EBCDIC de oito bits que permitiu a representao de 256 caracteres. O mundo provavelmente seria melhor se o EBCDIC tivesse se tornado o padro, porque ele inclua caracteres exclusivos suficientes para permitir praticamente qualquer representao. Porm, s a IBM e as empresas que montam equipamentos compatveis com os da IBM adotaram o EBCDIC. O cdigo ASCII de sete bits, formalmente conhecido como ANSI Standard X3.4-1077, pode representar 128 caracteres, mas nem todos eles correspondem a smbolos impressos. Esto includos no conjunto de caracteres todas as letras do alfabeto ingls (maisculas e minsculas), os numerais de 0 a 9, sinais de pontuao e muitos smbolos. Esse conjunto de cdigos padro usado em praticamente todos os computadores pequenos e seus perifricos, como tambm em computadores de grande porte na maior parte do mundo. O cdigo Morse tinha um nmero varivel de elementos (pontos e traos) para cada caractere e era bastante restrito - apenas letras, numerais e alguns sinais de pontuao. O cdigo de cinco bits tinha um nmero constante de elementos e alguns outros caracteres especiais, mas ainda no conseguia distinguir entre letras maisculas e minsculas. O ASCII no apenas permite o uso de letras maisculas e minsculas, mas tambm tem uma grande regularidade que a princpio pode no ser aparente. Por exemplo, para converter qualquer caractere alfabtico maisculo (de A at Z) em minsculo, necessrio apenas trocar o bit 6 de zero para um. Outra caracterstica a de que os bits de 4 at 7 dos caracteres numricos (0, 1, 2, 3, 4, 5, 6, 7, 8 e 9) so os valores BCD (do ingls: Binary-

21

Coded-Decimal) dos caracteres. Outra vantagem do padro ASCII que podem ser representados 128 caracteres diferentes pelos sete bits usados no cdigo (em vez dos 32 caracteres que podem ser representados no cdigo de cinco bits). Uma variao do cdigo ASCII, comumente chamado "ASCII estendido", obteve ampla aceitao com a introduo do computador pessoal pela IBM em 1981. O IBM PC e os computadores compatveis reconhecem um cdigo de oito bits, com as primeiras sete posies admitindo o padro ANSI. A posio de bit adicional estende o conjunto ASCII do computador, permitindo a representao de 128 caracteres adicionais. Essa extenso torna possvel o uso de cdigos estendidos pelos desenvolvedores de software para funes como marcaes de fim de pargrafo e indicadores de impresso em negrito em um sistema de processamento de textos.

1.2.4 - Cdigo de Huffman Supe-se que um texto seja constitudo de um conjunto de smbolos (ou caracteres) S = {s1,...,sn), n > 1. conhecida a freqncia fi vezes ao longo do texto, 1 <= i <= n. Deseja-se atribuir um cdigo a cada smbolo, de modo a compactar o texto todo. A restrio que se coloca que nenhum cdigo seja prefixo de algum outro. Ou seja, os cdigos procurados so aqueles dados por uma rvore binria de prefixo. Para cada n interno v, a aresta que conduz ao filho esquerdo de v rotulada com zero, enquanto o rtulo daquela que conduz ao direito igual a um. Cada smbolo si est associado a uma folha da rvore. Os cdigos dos smbolos so seqncias binrias. O cdigo de si est associado a uma folha da rvore. Os cdigos dos smbolos so seqncias binrias. O cdigo de si igual seqncia dos rtulos das arestas, do caminho desde a raiz da rvore at a folha

22

correspondente a si. A figura 1 ilustra um exemplo de cdigos de prefixo. O cdigo do smbolo s4 011, pois a seqncia dos rtulos das arestas, desde a raiz at s4, 011 [3].

Figura 1 Cdigos de prefixo Uma vantagem da utilizao de cdigos de prefixo a facilidade existente para executar as tarefas de codificao e decodificao. Por exemplo, suponha os cdigos dados pela rvore da figura 1. Suponha o seguinte texto: s4 s3 s3 s1 s3 s1 s4 s5 s1 s3 s3 s3 s3 s3 s2 s3 s5 s2 s2 s2 s4 Utilizando-se codificao: 01101010101000101000111000101010101010101010101000101101000100 0100011 a tabela da figura 1(a), obtm-se a seguinte

23

Para decodificar o texto, basta percorr-lo da esquerda para a direita, ao mesmo tempo em que a rvore percorrida, repetidamente, da raiz para as folhas. Nesse percurso, toma-se o caminho para a esquerda ou direita, na rvore, de acordo com o dgito correspondente encontrado no texto, 0 ou 1, respectivamente. Toda vez que uma folha atingida, um smbolo decodificado foi encontrado. Nesse caso, retoma-se o processo reiniciando-se o percurso na rvore a partir da raiz, para decodificar o prximo smbolo. No exemplo, o texto codificado por 0. Significa que se deve tomar o caminho da esquerda da raiz. O dgito seguinte 1, o que conduz para a direita desse ltimo n. Como o terceiro dgito 1, a folha correspondente ao smbolo s4 alcanada. O texto decodificado inicia-se, pois, por s4. Retomase ento a raiz da rvore. O prximo dgito na codificao 0. O caminho a seguir o do filho esquerdo da raiz. Em seguida, 1, aps 0 e aps 1. Com isso, atinge-se a folha correspondente a s3. Assim sendo, detectou-se que o smbolo seguinte a s4 no texto s3. A nova subseqncia 0101 conduziria, novamente, ao smbolo s3. O texto decodificado inicia-se, ento, por s4, s3, s3. E assim por diante, at esgotar a seqncia binria. imediato verificar que, uma vez conhecida a rvore de prefixo correspondente, o processo de codificao pode ser realizado em um nmero de passos linear ao tamanho da seqncia binria codificada. Uma questo central o comprimento do texto codificado, isto , o nmero de dgitos binrios da codificao. O comprimento da seqncia binria produzida por uma rvore binria de prefixo T denominado custo de T e denotado por c(T). No exemplo anterior, o custo da rvore da figura 1(b) igual a 69, pois a sequncia binria obtida possui 69 dgitos. O objetivo consiste, ento, em minimizar c(T), ou seja, construir T de modo que c(T) seja mnimo. Uma rvore de prefixo que satisfaa esta condio denominada

24

mnima ou rvore de Huffman. Codificando-se o texto do exemplo anterior com rvore da figura 2(b), obtm-se a seqncia: 110001010101110100101000001110100111111111110 que possui 45 dgitos. Logo, o custo da rvore da figura 2(b) igual a 45. Uma melhoria considervel em relao arvore da figura 1(b).

Figura 2 rvore de Huffman. Seja T uma rvore de prefixo correspondente a um dado texto, onde cada smbolo si ocorre fi vezes. Seja li o comprimento do cdigo binrio do smbolo si. imediato verificar que cada smbolo si contribui com fi.li unidades no custo c(T) = Somatrio fi.li, para 1 < n < i . Este valor corresponde ao conhecido comprimento de caminho externo ponderado de T. Se todas as freqncias so idnticas, ento T uma rvore binria completa e c(T) o comprimento de caminho externo de T.

25

1.3 Estrutura de Dados O algoritmo para construir a rvore de Huffman para um dado conjunto de n > 1 smbolos si de freqncias fi, 1 <= i <= n. O processo utiliza a tcnica conhecida como algoritmo guloso. Este consiste na construo da rvore mnima de forma iterativa. A rvore construda das folhas para a raiz, ou seja, os cdigos so determinados de trs para a frente. De um modo geral, o processo corresponde a obter subcdigos para subconjuntos de smbolos. Cada um desses subcdigos corresponde a uma subrvore. O passo geral iterativo produz a fuso de duas dessas subrvores, em uma nica. O processo se encerra quando o nmero de subrvores se reduz a um [3]. Seja T' uma subrvore binria de prefixo. Isto , as folhas de T' so smbolos selecionados dentre {s1, ..., sn}. Defini-se f(T'), a freqncia de T', como sendo a soma das freqncias dos smbolos si presentes nas folhas de T'. Por exemplo, os nmeros s freqncias das subrvores de raiz nos respectivos ns. O processo de construo da rvore de Huffman simples. Para iniciar, definem-se n subrvores, cada qual consistindo em um nico n contendo o smbolo si, 1 <= i <= n. A freqncia de cada uma dessas n subrvores , pois, igual freqncia do smbolo a ela correspondente. O passo geral, iterativamente, seleciona as duas subrvoes T'e T'', tais que f(T') e f(T'') sejam as duas menores freqncias. Essas duas subrvores de custo mnimo so fundidas em uma nica rvore T, de acordo com a operao #. Tal operao consiste em criar um novo n cujos filhos esquerdo e direito so as razes de T' e T'', respectivamente, conforme a figura 3. indiferente a escolha dentre T'e T'' para subrvore esquerda ou direita desse n. Observe que a freqncia f(T'# T'') da nova subrvore T'# T'' igual a f(T') = F(T''). O

26

algoritmo termina quando restar apenas uma nica subrvore, ou seja, em n-1 execues da operao #. A figura 4 ilustra a aplicao do algoritmo construo da rvore tima para o conjunto de smbolos e freqncias da figura 2(a). A rvore obtida pelo algoritmo exatamente aquela ilustrada na figura 2(b).

Figura 3 A Operao #. Para implementar o processo de construo da rvore de Huffman, observe que a cada iterao necessrio determinar as duas subrvores T'e T'' da coleo de menor freqncia. As subrvores T'e T'' so ento eliminadas e substitudas pela subrvore T' # T''. Deve-se utilizar, portanto, uma estrutura de dados que suporte as operaes bsicas de minimizao, incluso e excluso. Por exemplo, uma lista de prioridades.

27

S1

S2

S3

S4

S5

S2

S4

S5 5

S1 7 S3

S5

S1

S4

S2

12

S3

S5

S1

S4

S2

21

S3

12

S5

S1

S4

S2

Figura 4 Aplicao do algoritmo de Huffman. O processo de construo da rvore de Huffman dado pelo algoritmo 1. As freqncias f1, ..., fn, n > 1 so consideradas conhecidas, devendo-se construir previamente uma lista de prioridades com elas. Cada elemento desta lista corresponde a uma rvore T' composta de um nico n, com freqncia fi, 1 <= i <= n. Os procedimentos utilizados para manipular a lista de prioridades est invertida. Ento, o procedimento mnimo retira a menor prioridade e rearruma a lista. O procedimetno inserir (T, f, F), que

28

inclui o elemento T, de prioridade f, na lista F, igual ao algoritmo abaixo. Ao final, a rvore de Huffman a correspondente quela que restou na lista de prioridades F. Algoritmo 1 - Construo da rvore de Huffman. Para i := 1, n-1 faa Mnimo(T', f, F); mnimo(T'', f, F) T := T' # T'' F(T) := f(T') = f(T'') Inserir (T, f, F) imediato determinar a complexidade do algoritmo. Cada operao de minimizao ou incluso na lista de prioridade pode ser efetuada em O(log n) passos. A operao # requer apenas um nmero constante de passos. H um total de n-1 interaes. Logo, a complexidade O(n log n). Para verificar que o algoritmo encontra a rvore de custo mnimo, utiliza-se o seguinte lema: sejam si smbolos com freqncias fi, 1 <= i <= n, n > 1, tais que f1 e f2 so as duas menores frequncias. Ento existe uma rvore de Huffman para esses smbolos, em que os ns correspondentes a s1 e s2 so irmos localizados no ltimo nvel da rvore [3]. O teorema seguinte comprova a correo do algoritmo: seja T a rvore construda pelo algoritmo de Huffman para as freqncias f1,..., fn, n> 1. Ento, T mnima.

29

1.4 Compactao 1.4.1 - Compactao Suponha que se deseje armazenar um arquivo de grande porte em algum tipo de memria, primria ou secundria. Para melhor utilizar os recursos disponveis, deseja-se tambm minimizar, de alguma forma e na medida do possvel, o espao de memria utilizado. Uma forma de tentar resolver esse problema consiste em codificar o contedo do arquivo de maneira apropriada. Se o arquivo codificado for menor do que o original, pode-se armazenar a verso codificada em vez do arquivo propriamente dito. Isto representaria um ganho de memria. Naturalmente, uma tabela de cdigos seria tambm armazenada, para permitir a decodificao do arquivo. Essa tabela seria utilizada pelos algoritmos de codificao e decodificao, os quais cumpririam a tarefa de realizar tais operaes de forma automtica. O problema descrito conhecido como compactao de dados. A sua importncia foi muito importante nos primeiros anos de computao. Naquela poca, a questo de economia de memria era crtica, devido ao seu elevado custo. Com o passar do tempo, a memria foi se tornando cada vez mais abundante, como relativo decrscimo de custo. Entretanto, alguns programas de aplicao atualmente utilizados requerem muita memria. Entre esses, por exemplo, encontra-se programas que oferecem recursos visuais aos seus usurios. O problema de economia de memria ainda permanece na atualidade. O advento e larga utilizao de redes de computadores para a importncia da compactao de dados. Alm da economia de memria, procura-se tambm diminuir o custo da transmisso dos arquivos na rede: uma maior compactao dos dados de um arquivo corresponderia a um

30

nmero menor de dados a transmitir, o que implicaria um custo de transmisso menor. A hiptese concreta, nesse caso, que o custo de transmisso proporcional quantidade de dados a transmitir. Ao contrrio do que possa parecer, compactao no somente reduzir o tamanho de um arquivo: h vrias outras aplicaes que utilizam a compactao de dados. A reduo do espao fsico mais comumente utilizada em bancos de dados que, incorporando a compresso no projeto de seus registros, permite um significativo ganho em termos de ocupao em disco e velocidade de acesso. Como foi mencionado anteriormente, a utilizao mais conhecida da compactao de dados a reduo do espao ocupado por arquivos. De fato, esta aplicao mais comum e mais difundida comercialmente. Afinal, dado um dispositivo restrito de armazenamento que um disquete, e um grande depositrio de arquivos que um disco rgido, faz-se evidente a necessidade de muitas vezes realizar-se a reduo do tamanho de arquivos para transport-los ou simplesmente armazen-los. A compactao tambm utilizada para agilizar a transmisso de dados basicamente de duas formas: alterando a taxa de transmisso e permitindo o aumento no nmero de terminais de uma rede. Se possumos um modem que opera a 9600 bps (bits por segundo), possvel que ele transmita como se estivesse a 14400 bps? Sim! Basta que ele permita a compresso de dados transmitidos, ampliando sua capacidade de transferncia de informao. Na verdade, o modem continuar transmitindo a uma taxa de transmisso de 9600 bps, mas a taxa de transferncia de informao estar ampliada para 14400 bps. A compresso de dados permite, portanto, o aumento na velocidade de transmisso de dados.

31

Outra vantagem da compactao em comunicao, derivada do aumento de velocidade, a possibilidade de expanso de uma rede de computadores. Como uma ampliao do nmero de terminais de uma rede baixa o desempenho, dado o aumento do trfego de dados, torna-se necessria uma transmisso mais rpida de dados. H, portanto, duas alternativas: trocar os modem, utilizando modelos mais velozes, ou incorporar um chip com algoritmo de compresso aos modens existentes. Como a primeira alternativa mais cara, a segunda permite que se alcance o mesmo desempenho com muito menor custo. A compactao de dados, neste caso, permite a ampliao de uma rede de computadores de uma forma alternativa mais barata.

1.4.3 - Tipos de Compactao A compactao lgica refere-se ao projeto de representao otimizada de dados. Um exemplo clssico o projeto de um banco de dados utilizando seqncias de bits para a representao de campos de dados. No lugar de seqncias de caracteres ou inteiros, utiliza-se bits, reduzindo significativamente o espao de utilizao do banco de dados. Este tipo de compactao possvel de ser efetivada em campos projetados para representar dados constantes, como datas, cdigos e quaisquer outros campos formados por nmeros. A caracterstica lgica da compactao encontra-se no fato dos dados j serem comprimidos no momento do armazenamento, no ocorrendo sua transformao de dados estendidos para comprimidos. A compactao fsica aquela realizada sobre dados existentes, a partir dos quais verificada a repetio de caracteres para efetivar a reduo

32

do nmero de elementos de dados. Existem dois tipos de tcnicas para sinalizar a ocorrncia de caracteres repetidos: Um deles indica o caracter (ou conjunto de caracteres) repetido - Outras tcnicas indicam a freqncia de repetio de caracteres e representam isto atravs de seqncias de bits. atravs da substituio por um caracter especial;

1.5 Tcnicas de compactao 1.5.1 - Seleo de Caracteres Indicadores Antes da discusso das tcnicas propriamente ditas, necessrio o esclarecimento de como so codificados os caracteres especiais a serem substitudos pelos caracteres repetidos neste tipo de compresso fsica. H basicamente 3 formas de representao denominadas run-length , run-length estendido e insero e deleo.

1.5.1.1 - Codificao run-length Quando temos um arquivo onde ocorre uma repetio contnua de determinado caracter, por exemplo AAAAAAAAAAAA, possvel sua representao atravs da codificao run-length , da seguinte forma: Ce 12 A onde A o caracter repetido 12 vezes, o que indicado pelo caracter especial Ce. O caracter especial um daqueles caracteres no-imprimveis que conhecemos no cdigo ASCII, por exemplo.

33

Cabe salientar que esta codificao ocupa somente 3 bytes. Ora, como representar um inteiro como um byte? Deve-se ter a conscincia que em um byte pode ser armazenado um valor de 0 a 255, ou seja, pode-se indicar, como apenas um byte at 256 ocorrncias de caracter. Caso ocorra mais do que isso, deve utilizar outra representao mais eficiente. Como representaremos um nmero de repeties maior que 256? Utilizando o run-length estendido. A diferena deste para o run-length simples que h caracteres delimitadores no incio e no fim da seqncia de codificao: SO R A 980 SI onde SO (do ingls: shift out) um caracter especial indicador de incio de uma seqncia de caracteres definida pelo usurio at que SI (do ingls: shift in) seja encontrado. Esta uma propriedade de cdigos de caracteres, como o ASCII e EBCDIC. O caracter R indica a compresso run-length, onde o caracter A indicado como repetido 980 vezes. Como o valor 980 ultrapassa o limite de 256 de um byte, torna-se necessria a utilizao de mais um byte para a representao do valor.

1.5.1.2 - Codificao por insero e deleo O que fazer quando no for possvel a colocao de caracteres especiais? H determinados casos que os caracteres especiais utilizados conflitam com outros aplicativos, de transmisso de dados, por exemplo. Desta forma, utiliza-se um caracter convencional como indicador de compactao.

34

Como na lngua portuguesa utiliza-se muito pouco as letras K, W, Y, pode-se, por exemplo, indicar a compresso de um arquivo de texto na forma: K 12 A. 1.5.2 - Exemplos de Tcnicas de Compresso Orientada a Caracter As tcnicas de compresso orientadas a caracter no so as mais eficientes ou as mais sofisticadas. Pelo contrrio, em geral elas so utilizadas num primeiro nvel de compresso multinvel, onde os demais nveis podem ser tcnicas estatsticas de compresso. Aqui sero analisados 8 tcnicas de compresso orientada a caracter, de modo a dar uma noo das possveis aplicaes deste tipo de compresso.

1.5.2.1 - Supresso de Caracteres Nulos Nesta tcnica, temos como objetivo comprimir apenas os caracteres nulos ou brancos. Em geral, so comprimidos caracteres correspondentes ao espao em branco. Para a compactao, utiliza-se a seguinte seleo de caracteres indicadores: Ce N , onde Ce um caracter especial e N o nmero (em binrio) de caracteres brancos repetidos seqencialmente. Ento, por exemplo, uma seqncia do tipo: ...vazio. Exatamente o que... Pode ser comprimida como sendo: ...vazio.Ce8Exatamente o que...

35

o que demonstra uma reduo de 6 bytes no trecho apresentado. Outras formas de indicao de compresso podem ser utilizadas, com visto na seo anterior. Como trata-se de uma compresso de brancos, no h necessidade de explicao do caracter comprimido.

1.5.2.2 - Mapeamento de Bit Quando sabida a existncia de mltiplas ocorrncias no consecutivas de determinado caracter no arquivo a compactar, utiliza-se a compresso por mapeamento de bit. Esta tcnica utiliza-se de um byte no arquivo comprimido para indicar, atravs dos bits, a ocorrncia do caractere repetido. Desta forma, caso desejarmos comprimir todos os caracteres "a" de um texto, devemos indic-lo no mapa de bits. Cada mapa descreve 8 bytes, um por bit do arquivo manipulado. Portanto, para letra encontrada a cada trecho de 8 bytes, ser assinalada no mapa de bits. Por exemplo: ... abacate ... ser descrito como: ... Mbbcte... onde Mb o mapa de bits correspondente compresso do caracter "a" . Este mapa composto, para o exemplo, dos bits: 01010111 onde o primeiro zero indica a presena de um caracter "a" na primeira posio, valor um em seguida indica um caracter diferente, e assim por diante, at completar o mapa. Convenciona-se, portanto, que o bit 0 indica a presena do caracter a compactar e o bit 1 a sua ausncia.

36

1.5.2.3 - Comprimento de Fileira Esta tcnica aplica a indicao semelhante run-length de compresso. O formato permite a determinao do caracter repetido: Ce C N, onde Ce o caracter especial, C o caracter repetido e N o nmero (binrio) de repeties. Como podemos perceber, esta tcnica tambm permite apenas a compresso de um caracter por vez.

1.5.2.4 - Compactao de Meio Byte Este tipo de compactao utilizado quando encontramos uma seqncia de bits em comum nos caracteres de determinado arquivo. Um tipo de repetio de bits de grande ocorrncia a que acontece em caracteres numricos. Por exemplo, o conjunto binrio da tabela ASCII para os caracteres numricos dado pela tabela 1. Tabela 1 Conjunto binrio da tabela ASCII. Decimal 0 1 2 3 4 5 6 7 8 9 Binrio 0011 0000 0011 0001 0011 0010 0011 0011 0011 0100 0011 0101 0011 0110 0011 0111 0011 1000 0011 1001

37

Se isolarmos os primeiros 4 bits de cada byte de caracter numrico, veremos que h uma constncia de valores. Estes valores constantes so um exemplo de objetos de compactao de meio byte. A compactao de meio byte propriamente dita consiste na seguinte seqncia de caracteres indicadores: Ce N C1 C2 C3 C4 C5... onde Ce o caracter especial, N o nmero (binrio) de caracteres comprimidos e Cn a metade do caracter comprimido. Na seqncia de caracteres indicadores apresentada so apresentados 5 caracteres porque este o mnimo para que a compresso seja vlida, uma vez que at 4 caracteres ela necessita um nmero de byte igual ou maior. Observe tambm que o nmero de repeties est ocupando apenas meio byte. Isso significa que ele pode indicar apenas at 16 caracteres, ou seja, este formato permite a compactao de uma seqncia de, no mximo, 16 caracteres. Mas ento surge a pergunta: no h como estender este formato para permitir a compactao de uma seqncia maior de caracteres? A resposta sim, existe a compactao de byte inteiro, onde o nmero N ocupa 1 byte, ao invs de meio. Neste formato estendido, o restante dos caracteres indicadores permanecem os mesmos, sendo alterado apenas a representao do nmero de caracteres. Com a representao de byte inteiro, a capacidade de compresso aumenta para 256 caracteres, o que permite um ganho expressivo em se tratando de longas seqncias de caracteres.

1.5.2.5 - Codificao Diatmica Esta tcnica de compactao permite a representao de um par de caracteres em apenas um caracter especial. Normalmente utilizam-se tabelas

38

com pares de caracteres e sua freqncia de ocorrncia em determinado tipo de arquivo. Obviamente procura-se substituir os caracteres de maior freqncia, associando a cada dupla um caracter especial. Em texto da lngua portuguesa, por exemplo, duplas de ocorrncia freqente so a letra "a" acentuada com til seguido da letra o "ao" e a letra "e" com acento agudo seguido de um espao em branco "". A cada uma dessas seqncia deve-se atribuir um caracter especial para nos permitir a compactao atravs da codificao diatmica. Obviamente, estes so apenas dois exemplos de duplas de caracteres, numa tabela normal para compactao utilizam-se mais de 20 duplas para que seja obtida uma compresso razovel.

1.5.2.6 - Substituio de Padres A substituio de padres semelhante codificao diatmica, pois tambm ocorre a substituio de um conjunto de caracteres por um caracter especial. PALAVRA => Ce O processamento desta tcnica semelhante ao da substituio de padres, com a diferena de que so avaliados um nmero maior de caracteres. Desta forma, so estabelecidas tabelas de palavras de maior freqncia de ocorrncia para substituio com o caracter especial. A utilizao mais comum para este tipo de compactao a de arquivos de programas de linguagens de programao. Uma vez que as linguagens contm diversas palavras que se repetem freqentemente em programas, utiliza-se esta caracterstica para a sua compactao.

39

Uma variante da substituio de padres para permitir a codificao de um maior nmero de palavras a utilizao de dois caracteres para indicao da ocorrncia de determinada palavra: C N, onde C um caracter escolhido para indicar a compactao e N o nmero (binrio) da palavra a substituir. Isso permite a codificao de at 256 palavras reservadas, o que anteriormente era limitado ao nmero de caracteres especiais que poderamos utilizar. Por exemplo, as palavras reservadas begin e end da linguagem Pascal poderiam ser, por exemplo, substitudas pelos cdigos $1 e $2. As demais palavras reservadas da linguagem tambm poderiam ser codificadas desta maneira, permitindo uma compactao considervel de um arquivo de programa. Como esta tcnica assemelha-se muito da codificao diatmica, deve tomar como base para a programao o algoritmo e o fluxograma apresentados para aquela tcnica. Desta forma no sero apresentados formas distintas de programao.

1.5.2.7 - Codificao Relativa Esta tcnica de compactao realizvel quando existe a transmisso de seqncias de caracteres numricos. Estas seqncias podem ser valores dentro de intervalos definidos ou valores binrios. A transmisso de valores intervalares pode ser exemplificada por transmisses de dados provenientes de sinais de sensores. Um exemplo de transmisso binria o fax. Nestes dois casos, suas transmisses podem ser comprimidas atravs da codificao relativa. Para cada um dos casos existe

40

um processamento adequado aos tipos de valores envolvidos, por isso, veremos como o processamento para a codificao de valores intervalares e para valores binrios.

1.5.2.8 - Valores Intervalares Neste primeiro tipo, a compactao somente vlida se existe um intervalo definido de valores, caso contrrio no ocorre uma compresso satisfatria. Isso porque este tipo de compresso baseia-se na colocao da variao numrica de um valor a outro, desta forma: Val Var1 Var2... onde Val o primeiro valor da seqncia, VarN a variao do valor anterior para o atual. Exemplificando de forma numrica, seja a seguinte seqncia de caracteres numricos: 10.3 10.1 10.8 10.4 10.4 10.9 10.2, pode ser compactada atravs da codificao relativa, ficando os caracteres na forma: 10.3 -.2 .7 -.4 0 .5 -.7, ou seja, numa seqncia dentro de um intervalo definido entre 10.0 e 10.9, foi possvel a compresso de um conjunto de 34 para 24 caracteres. A implementao desta tcnica resume-se a apenas no processamento da gravao direta da diferena entre os dois valores anteriores no campo atual a comprimir. No h nenhum outro esquema a seguir para descrever o processo.

1.5.2.9 - Valores Binrios

41

Como afirmado anteriormente, o fax utiliza-se desta forma de compactao, portanto a comparao existente no ser mais entre um valor e outro, mas entre uma linha e a seguinte. Cada linha um vetor de valores binrios, que representam o mapa de bits do desenho da pgina. O que ser quer transmitir apenas a variao de uma linha para outra, evitando-se a transmisso de toda a linha. Ento, um trecho de linha binria poderia ser: ... 01001011100010101... e a sua seguinte: ... 01001011111100001..., a diferena seria em 5 bits: ... _________MMMM_M__... . A representao da transmisso dessa diferena entre linhas pode ser feita de duas formas: indicando a posio da mudana a partir do incio ou a posio a partir da mudana anterior. Alm da posio da mudana, normalmente indica-se a quantidade de mudanas de ocorreram. Para o trecho de linha apresentado anteriormente, pode-se representar como ponto fixo da mudana seguido da quantidade de bits alterados: 529 4 534 1, caso se fosse esta a nica alterao na linha, que normalmente possui 1728 bits, seria uma compactao expressiva. Compactando-se a partir do clculo do deslocamento, o nmero de bits a transmitir se reduz ainda mais: 529 4 5 1, supondo que no h nenhuma alterao anterior a que est apresentada, a posio inicial fixa e as demais relativas umas s outras, contabilizando-se apenas o numero de bits de distncia de uma a outra.

42

1.6 - Compactao Estatstica A idia da compresso estatstica realizar uma representao otimizada de caracteres ou grupos de caracteres. Caracteres de maior freqncia de utilizao so representados por cdigos binrios pequenos, e os de menor freqncia so representados por cdigos proporcionalmente maiores. Neste tipo de compactao portanto, no necessitamos saber qual caracter vai ser compactando, mas necessrio, porm, ter o conhecimento da probabilidade de ocorrncia de todos os caracteres sujeitos compresso. Caso no seja possvel a tabulao de todos os caracteres sujeitos compresso, utiliza-se uma tcnica adequada para levantamento estatstico dos dados a compactar, formando tabelas de probabilidades. Esta Teoria baseia-se no princpio fsico da Entropia. A Entropia a propriedade de distribuio de energia entre os tomos, tendendo ao equilbrio. Sempre que um sistema fsico possui mais ou menos quantidade de energia que outro sistema fsico em contato direto, h troca de energia entre ambos at que atinjam a entropia, ou seja, o equilbrio da quantidade de energia existente nos sistemas. Ao atingir o estado de equilbrio, sabe-se que estes sistemas esto utilizando o mnimo de energia possvel para sua manuteno, e assim se mantero at que outro sistema interaja sobre eles. Aplicada informao, a Teoria da Entropia permite a concepo de uma teoria da Harmonia, ou seja, um ponto de equilbrio onde a informao pode ser representada por uma quantidade mnima de smbolos. Para chegarmos a esta representao ideal, basta que tenhamos a quantidade de smbolos utilizada e a probabilidade de ocorrncia deles. Com base nisso, possvel calcular a quantidade mdia de bits por intervalo de smbolo.

43

1.7 - Compactao Fixa versus Compresso Auto-adaptvel Caso as probabilidades nas quais foram concebidos os cdigos da tabela forem distintos para determinado arquivo a compactar, este ser prejudicado na compactao. Para resolver este caso utiliza-se uma tabela adaptvel. A tabela adaptvel consiste na mesma tabela que conhecemos, contendo o caracter e seu cdigo, acrescida de mais uma coluna contendo a contagem de ocorrncia do caracter no arquivo a compactar. Efetua-se, portanto, uma contagem de quantos caracteres ocorrem no arquivo, e ordenase a coluna dos caracteres em ordem crescente a partir desta coluna da contagem, mantendo a coluna de cdigo inalterada. Como resultado, obtm-se uma tabela com os caracteres de ocorrncia mais freqente sendo codificados com menos bits. Tabela 2 Caracter, cdigo e a contagem. Caracter C1 C2 C3 C4 C5 Cdigo 0 10 110 1110 1111 Contagem 0 0 0 0 0

Considere a tabela 2, contendo o caracter, o cdigo e a contagem. Caso o caracter C3 ocorra 21 vezes, o C2 18 vezes, C1 10 vezes, o C5 3 vezes e o C4 2 vezes, a tabela 3 mostra a nova configurao.

44

Tabela 3 Nova configurao. Caracter C3 C2 C1 C5 C4 Cdigo 0 10 110 1110 1111 Contagem 21 18 10 3 2

Comparando-se a tabela 2 e 3, a codificao continuou a mesma, mas a correspondncia foi alterada para a situao especfica do arquivo comprimido em questo. Observamos, portanto, a necessidade de realizarmos um processamento de leitura e clculo anterior compresso propriamente dita, o que implica em maior tempo gasto do que com a utilizao da tabela fixa. Com a compactao auto-adaptvel ganha-se, obviamente, uma compactao mais eficiente. Por outro lado, h um problema pela prpria variabilidade da tabela: para a descompactao, h a necessidade de se anexar a tabela ao arquivo compactado, para que os cdigos correspondentes possam ser devidamente decodificados.

1.8 - O cdigo de Lempel-Ziv Um cdigo alternativo o cdigo de Lempel-Ziv. Por volta de1977, Abraham Lempel e Jacob Ziv desenvolveram uma classe de compactao de dados com dicionrio adaptativo chamado de Lempel-Ziv. Posteriormente, Terry Welch, melhorou o cdigo de Lempel-Ziv, criando o hoje chamado de cdigo LZW que constri um dicionrio dos grupos de caracteres mais freqentemente usados. importante ressaltar que antes que o arquivo seja descompactado necessrio que se envie o dicionrio de compactao. Este mtodo melhor para compactao de arquivos textos

45

cujo contedo de caracteres ASCII, mas no to bom para arquivos de imagens, cujo contedo possui amostras repetitivas de dgitos binrios que podem no ser mltiplos de 8 bits [3]. O algoritmo LZW organizado por uma tabela de traduo, chamada de tabela de seqncia de caracteres, que mapeia esta seqncia de dados de entrada em cdigos de tamanhos fixos. O uso de cdigos de 12 bits comum. A tabela de seqncia de caracteres LZW tem uma propriedade prestabelecida que para toda seqncia de caracteres j tabulada sua seqncia de caractres anterior j esteja na tabela. Isto , se uma seqncia de caractres

K, composta de uma string e algum nico caracter K, estiver na tabela,


ento est na tabela. K chamado de caracter extendido da seqncia de caractres . A tabela de seqncia de caracteres inicializada para conter todo o conjunto de caracteres nicos [3]. Abaixo o algoritmo LZW de compactao proposto por Terry Welch: Inicializar tabela que conter caracteres Ler a primeira entrada de caracteres prefixo Passo: Ler prxima entrada de caracter K Se K no for suficiente (entrada esgotada): cdigo() -> sada; SAI Se K existir na tabela de strings: K ; repetir Passo. Seno K no est na tabela: cdigo() -> sada;

K-> tabela de strings;


K-> repetir Passo. Abaixo o algoritmo LZW de compactao proposto por Terry Welch: Descompactao: Leia cdigo primeira entrada -> CDIGO ->VELHOcdigo;

46

Com CDIGO = codigo(K); K->sada; Prximo Cdigo: Leia prxima entrada de cdigo -> CDIGO ->INcdigo; Se no h cdigo: Saia.. seno Prximo Smbolo: Se CDIGO = cdigo(K); K->sada; cdigo() -> CDIGO; Repetir prximo smbolo Seno se CDIGO = cdigo(K): K-> sada; VELHOcdigo, K-> tabela de string INcdigo->VELHOcdigo; Repetir prximo cdigo. Colocamos na figura 5 abaixo uma tabela que ser utilizada no exemplo da figura 6.
TABELA DE STRINGS a a b b c c ab 4 ba 5 abc 6 cb 7 bab 8 baba 9 aa 10 aa 11 aaaa 12 TABELA ALTERNATIVA a a b b c c 1b 4 2a 5 4c 6 3b 7 5b 8 8a 9 1a 10 10a 11 11a 12

Figura 5 Tabela de Strings Esta tabela inicializada com trs valores de cdigo para trs

47

caracteres. Utilizamos esta tabela de strings para codificarmos os smbolos de entrada mostrados na figura 6 abaixo.
Smbolos de a b a b c b a b a b a a a a a a a entrada 1 2 4 3 5 8 1 10 11 1 Cdigos de 5 9 11 7 sada Novas strings 4 6 8 10 12 adicionadas tabela Figura 6 Um exemplo de compactaa

Nesta figura, os dados de entrada esto sendo lidos da esquerda para direita, comeando pelo caracter a. medida que vo sendo encontradas seqncias de caracteres diferentes, um novo cdigo atribudo seqncia e adicionado tabela. Na figura 7 temos um exemplo de descompactao utilizando LZW.

Cdigos de entrada

1 v a

2 v b

4 3 v v 1b c v a ab 6 c

Dados de sada Strings adicionados tabela

a 4

8 1 10 v v v 5b a 1a v v 2a a v b ab bab a aa 8 7 9 10

5 v 2a v b

11 v 10a v 1a v a aaa

11

Figura 7 Exemplo de descompactao. Nesta figura temos que o cdigo traduzido por realocao recursiva do cdigo com um cdigo de prefixo e seu caracter extendido proveniente da tabela de strings, figura 5. Por exemplo, o cdigo 5

48

substitudo pelo cdigo 2 e a, e ento o cdigo 2 substitudo por b. Existe tambm o VLC (do ingls: Variable-Length-Code) LZW que usa uma variao do algoritmo LZW onde cdigos de tamanho variado so usados para sobrescrever amostras detectadas dos dados originais. Ele usa um dicionrio construdo a partir de trechos encontrados nos dados originais. Cada novo trecho semelhante inicializado no dicionrio e um endereo indexado usado para substituir a faixa compactada. O trasmissor e o receptor mantm o mesmo dicionrio. A parte VLC do algoritmo baseada num tamanho de cdigo inicial (o cdigo inicial de LZW), que especifica o nmero inicial de bits usados para compactao. Quando o nmero de amostras detectadas pelo compactador no stream de entrada exceder o nmero de amostras codificveis ento o nmero de bits do cdigo LZW acrescido de um. O tamanho do cdigo inicialmente transmitido para que o receptor saiba o tamanho do dicionrio e o tamanho das palavras-cdigo. Em 1985 , o algoritmo LZW foi patenteado pela Sperry Corp. Ele usado no formato de arquivo GIF e similar a tcnica usada para compactar dados no V.42bis modems. O cdigo de Lempel-Ziv, assim como o cdigo de Huffman, possui algumas desvantagens. A compresso LZ substitui as amostras repetitivas detectadas atravs de referncias ao dicionrio. Infelizmente quanto maior o dicionrio, maior o nmero de bits necessrios para a referncia. O valor timo do dicionrio tambm varia quanto aos diferentes tipos de dados. quanto mais varivel os dados, menor ser o valor timo para o dicionrio [3]. 1.9 - Codificao Lempel-Ziv A compactao Lempel-Ziv um tipo de compactao de cadeia que forma strings de caracteres a partir de sua ocorrncia, criando tabelas de

49

strings conforme vo acontecendo. Dada a interessante abordagem utilizada nesse tipo de compactao, melhor do que as anteriormente estudadas, a codificao Lempel-Ziv foi aprimorada e tornada padro para a compresso de dados transmitidos via modem. Esta tcnica padro baseada na Lempel-Ziv a recomendao V. 42 bis do CCITT (do ingls: Consultative Committee for International Telephone and Telegraph). A codificao Lempel-Ziv utiliza probabilidades de cadeias de caracteres ao invs de apenas um caracter. Qual a vantagem disso? Em primeiro lugar, vamos analisar qual a influncia da probabilidade sobre o nmero terico de bits para representao de determinado conjunto de caracteres. Para tanto, vamos pegar os caracteres C1 e C2 para verificar a relao entre probabilidade e nmero terico de bits. Para sabermos este nmero terico de bits precisamos calcular a harmonia, que nos d o nmero de bits por intervalo de smbolo. Assim, se C1 tiver probabilidade 0,8 e C2 tiver 0,2, sua entropia ser 0,72, e assim sucessivamente, conforme mostra a tabela 4. Tabela 4 - Entropia. C1 0,8 0,7 0,6 0,5 C2 0,2 0,3 0,4 0,5 Entropia 0,72 0,88 0,97 1

Comparando os de C1 e C2 na tabela 4, quanto mais distinta for a pordentagem, maior o aproveitamento de bits. Para aproveitarmos isso como forma de compactao, basta criarmos conjuntos de caracteres de forma a acumular porcentagens.

50

Assim, podemos acumular os caracteres em cadeias do tipo C1C1, C1C2, etc. Para verificarmos se h ganho no comprimento mdio de bits, vamos iniciar analisando as probabilidades de cadeias de 2 caracteres na tabela 5 , onde foi estabelecido C1 com probabilidade 0,7 e C2 com 0,3. Tabela 5 Probabilidade de ocorrncia. C1 C1 C2 C2 C2 C2 C1 C2 0,49 0,21 0,21 0,09

A probabilidade de ocorrncia da cadeia C1C1 de 0,7*0,7 = 0,49, ou 49%. O mesmo raciocnio aplica-se s demais combinaes. Utilizando a codificao Huffman, podemos estabelecer o tamanho mdio ocupado pelo grupo de cadeias da tabela anterior.

Tabela 6 Tamanho mdio de bits C1 C1 C2 C2 C1 C2 C1 C2 0 10 110 111

Obtendo-se os cdigos binrios, que podem ser observados na tabela 6, pode-se calcular o tamanho mdio de bits ocupado, dado por: T = 0,49*1 + 0,21*2 + 0,21*3 + 0,09*3 = 1,81 bits O valor de 1,81 bits para representao da cadeia pode parecer grande, mas se dividirmos por 2, teremos 0.905 bit por caracter, menor que 1 bit por caracter no caso de codificarmos o bit 0 para C1 e bit 1 para C2.

51

Seguindo este raciocnio, podemos ampliar a idia para um nmero maior de caracteres e chegaremos concluso de que, quanto maior a cadeia, mais caracteres sero passveis de compactao. Desta forma, a Lempel-Ziv utiliza um conjunto de regras para analisar as cadeias de um conjunto de caracteres pr-definido. As cadeias so montadas e codificadas medida em que so lidos os caracteres a codificar. A forma de composio destas cadeias est descrita na tcnica V. 42 bis descrita a seguir. A Lempel-Ziv foi melhorada e utilizada como uma tcnica padro para transmisso atravs de modens. Esta tcnica possui um tamanho mximo de cadeia que pode variar de 6 a 250 caracteres para formao de cadeia. Existe um dicionrio com 512 cadeias bsicas codificadas, mas este no restrito a elas. O dicionrio de cadeias dinmico e pode ter cadeias acrescentadas e retiradas em tempo de compactao. A formao de novas cadeias baseada na comparao das cadeias lidas com as existentes no dicionrio. Se a cadeia lida no existe, ela acrescentada e recebe um cdigo que a representa como cadeia compactada. Como o modem transmissor o que faz a compactao e o dicionrio dinmico, como o modem receptor ir decifrar os cdigos para descompact-los? Simples, a cada nova cadeia formada no transmissor so enviados os caracteres ou a primeira subcadeia que a compe e o cdigo correspondente nova cadeia, para que exista uma rplica do dicionrio no receptor. utilizada uma estrutura de dados em rvore para implementao do dicionrio de cadeias. A partir de uma cadeia pr-definida formada uma rvore para processamento das cadeias. Seja a cadeia pr-definida DA , a

52

partir da qual derivam-se as cadeias DATA e DADO. Para esta seqncia, a estrutura ser dada pela figura 5.

DA 300 342 T 343 A D 378 O 379

Figura 8 rvore para processamento das cadeias Os valores ao lado de cada caracter o cdigo correspondente cadeia composta at aquele n da rvore, ou seja, a cadeia DA possui cdigo 300, a cadeia DAT possui cdigo 342, e assim por diante. Desta forma, amplia-se o dicionrio sem prejudicar as codificaes existentes e permite, ao mesmo tempo, a verificao de variaes deste cdigos. Existe ainda, a possibilidade de substituio de cdigos pouco utilizados. Uma vez definida um nmero N de cdigos possveis, ao atingir este nmero, procura-se um cdigo que corresponda a um n folha que no esteja sendo utilizado na compactao em curso. Caso exista, a nova cadeia utiliza o cdigo da cadeia antiga no utilizada. Ocorre, portanto, eliminao de cdigos do dicionrio. Esta a tcnica padro V. 42 bis utilizada para compresso na transmisso de dados via modem. Ela baseia-se na codificao em cadeia de Lempel-Ziv, utilizando-se da multiplicao das probabilidades de ocorrncia de caracteres, para, em cima das estatsticas de cadeias, permitir a compresso de bits utilizados na transmisso de dados.

53

CAPTULO 2
O PROBLEMA 2.1 - Introduo Basicamente compactar dados significa reduzir o seu tamanho original de tal maneira que possamos reconstitu-lo originalmente sem perda de informao. Ela pode ser aplicada em arquivos de dados, documentos, imagens, etc. A figura 6 mostra o processo de compactao.

SMBOLOS DE ENTRADA COMPACTAO SEQUNCIA DE CARACTERES

DADOS COMPACTADOS CDIGO

MEIO

DADOS ARMAZENADOS/ LINHA DE COMUNICAO

SADA DE SMBOLOS DADOS DESCOMPACTAO

Figura 9 - Ilustrando compactao de Dados

54

As duas tcnicas mais utilizadas a de cdigo estatstico e a de supresso de seqncias repetitivas. Vamos fazer uma digresso sobre estas duas tcnicas. O mais popular mtodo de compactao que utiliza cdigo estatstico o Cdigo de Huffman que consiste em traduzir pedaos de tamanho fixo em smbolos de tamanho varivel. Ele procura uma maneira de gerar cdigos para os smbolos de entrada cujo tamanho destes cdigo em bits aproximadamente log2(probabilidade do smbolo), onde a probabilidade do smbolo a freqncia relativa de ocorrncia de um smbolo dado expresso em probabilidade. Por exemplo, se o smbolo Y encontrado 0,1 por cento do tempo, ento ele ser representado por 10 bits. Na implementao de nosso compactador utilizando Cdigo de Huffman, tomamos um arquivo .txt que desejamos compactar e geramos um arquivo .huf cujo contedo inteligvel apenas quando aplicamos o processo inverso o que chamamos de descompactao. Como propsito de pesquisa, optamos por fazer uma filtragem do arquivo texto inicial, que consiste basicamente em considerar somente caracteres maisculos; ou seja, qualquer texto que utilize nosso programa s poder ser processado, para nvel de pesquisa, se todos seus caracteres forem maisculos. Entretanto, o compactador de Huffman implementado funciona tanto para caracteres maisculos como para caracteres minsculos. Um formulrio no programa implementado a partir da leitura de um texto retorna uma estatstica de freqncia de caracteres. Para obter uma estatstica fixa, fizemos uma compilao de cem arquivos textos diferentes das mais diversas fontes, em lngua portuguesa, aplicando o programa implementado, cujos resultados foram tabulados e cuja tabulao ser utilizada para se estimar a mdia em percentagem de caracteres de um texto qualquer em lngua portuguesa.

55

Tabela 7 - Estatstica Fixa. Caracter espao E A O S R U M N I D P T C Q L . , | | G F H B Z I X W K ! Cadeia de bits Huffman 000 101 111 0011 0111 1001 1101 00101 01001 01000 01011 01101 10001 10000 001001 010101 110011 110010 0010001 0101001 0101000 0110011 0110010 1100001 00100001 01100001 01100011 01100010 11000001 001000001 011000001 110000001 110000000 0010000001 0110000001 0110000001 01100000000 001000000001 0010000000000 001000000011 Percentagem 16,90% 11,40% 8,53% 7,88% 6,77% 5,36% 4,10% 4,00% 3,90% 3,80% 3,47% 2,99% 2,87% 2,69% 2,14% 1,66% 1,13% 1,00% 0,90% 0,90% 0,90% 0,75% 0,70% 0,63% 0,48% 0,48% 0,40% 0,35% 0,30% 0,25% 0,23% 0,15% 0,12% 0,12% 0,10% 0,0005% 0,00025% 0,00025% 0,00025% 0 00025%

56

estatstica fixa obtida para a lngua portuguesa poder ser

utilizada para que possamos montar a rvore de Huffman, utilizando sempre as freqncias padres, o que pode gerar uma compactao no tima. Evitamos armazenar uma tabela de correspondncia de caracteres com sua seqncia de bits montada dinamicamente pela rvore de Huffman gerada ao se compactar o arquivo. A tabela 7 ter que ser de alguma forma armazenada, ou como cabealho do arquivo compactado, ou como algum arquivo anexo. 2.2 - Proposta para implementao do compactador de Huffman Como proposta para implementao do compactador de dados dividimos o programa em dois formulrios principais. O primeiro formulrio mostrado na figura abaixo.

Figura 10 Formulrio Huffman

57

Ele mostra dinamicamente o processo de compactao e descompactao, desde a filtragem dos dados, montagem da estatstica ordenada por cdigo ASCII, montagem da estatstica ordenada por freqncia de incidncia, montagem da tabela de Huffman, montagem da cadeia de bits, at a descompactao a partir da leitura da rvore de Huffman montada dinamicamente e da leitura seqencial da cadeia de bits. O outro formulrio, mostrado na figura abaixo, apresenta o processo de compactao nos retornando os ndices de compactao, o tempo levado para montar a rvore de Huffman, o tempo levado para montar a cadeia de bits, o arquivo .huf gerado e o tempo de descompactao.

Figura 11 Formulrio de Compactao Como vimos, o cdigo de Huffman consiste basicamente em ordenar por taxa de incidncia os caracteres de um arquivo texto, montar a rvore binria utilizando o algoritmo de Huffman e posteriormente, em fase de compactao, percorrer a rvore montando seqencialmente nossa cadeia

58

de bits. Esta cadeia de bits ser gravada como um arquivo .huf, em binrio, para que possamos conseguir fisicamente um arquivo final reduzido. A linguagem utilizada para implementao do compactador implementado foi a Linguagem C++, utilizando o Builder como compilador. Esta linguagem poderosssima no que tange a recursos oferecidos de orientao a objeto, permitindo-nos utilizar uma filosofia que est modificando os paradigmas da programao, o conceito de "reutilizar, reutilizar, reutilizar". Nesse sentido, utilizamos uma ferramenta de muito impacto em C++ para implementao inicial de nosso cdigo de Huffman: as STL's (do ingls: Standart Template Library). A STL uma biblioteca padro de gabaritos e foi desenvolvida por Alexander Stepanov e Meng Lee na HewlettPackard. Baseada na pesquisa de campo da programao genrica e teve tambm contribuies significativas de David Musser. Alm de se utilizar de gabaritos, uma STL gera cdigos que o programador no necessariamente precisa digitar, combinando a generalizao de gabaritos com a disponibilidade de bibliotecas padres. As STL's possuem trs componentes-chaves, contineres, iteradores e algoritmos. Em nosso projeto, utilizamos um conteiner chamado de multimap que possui as seguintes caractersticas: mapeamento um para muitos, duplicatas no-permitidas e pesquisa rpida usando chaves. Est na classe de contineres associativos. Contineres associativos da STL destinam-se a fornecer acesso direto para armazenar e recuperar elementos via chaves. Ao todo existem quatro contineres associativos: multiset, set, multimap e map. Em cada continer, as chaves so mantidas em ordem classificada. Iterar atravs de um continer associativo percorre o mesmo em uma ordem classificada para aquele continer. As classes multiset e set fornecem operaes para manipular conjuntos de valores nos quais os prprios valores

59

so as chaves, isto , no h um valor separado associado a cada chave. A principal diferena entre um multiset e um set que um multiset permite chaves duplicadas e um set no permite. As classes multimap e map fornecem operaes para manipular valores associados com chaves (estes valores s vezes so referidos como valores mapeados). A principal diferena entre um multimap e um map que um multimap permite chaves duplicadas com valores associados. Em nosso projeto utilizamos o multimap, para armazenagem e recuperao rpidas de chaves e valores associados (pares chave/valor). Quando se insere em um multimap, um objeto pair, que contm a chave e o valor, usado. A ordenao das chaves determinada por um objeto funo comparadora. Por exemplo, em um multimap que usa inteiros como tipo de chave, as chaves podem ser classificadas em ordem ascendente ordenando as chaves com o objeto funo comparadora less<int>. Chaves duplicadas so permitidas em um multimap, de modo que valores mltiplos podem ser associados com uma chave nica. Isto chamado freqentemente de um relacionamento um para muitos. Um multimap suporta iteradores bidirecionais mas no iteradores de acesso aleatrio. Depois dessa breve incurso sobre STL's, voltemos ao algoritmo de Huffman. Nosso primeiro passo, contar quantos caracteres de cada smbolo aparecem no texto e orden-los por critrio de apario. Conseguimos isso processando a cadeia de strings (texto inicial), caracter por caracter na implementao do compactador, linha por linha e a medida que processamos este texto alimentamos o multimap, que com o objeto funo comparadora adequado nos retornar a lista completamente ordenada. A segunda fase do Cdigo de Huffman consiste em montar a rvore de Huffman da estatstica concluda. imprescindvel que se utilize uma rvore binria. Somente com esta estrutura de dados que iremos conseguir

60

um cdigo unicamente decodificvel. Uma rvore binria uma N-ary tree cujo N seja igual a dois. H algumas caractersticas interessantes que provem da limitao de N = 2. Por exemplo, h um interessante relacionamento entre rvores binrias e o sistema de nmeros binrios. rvores binrias so teis para representao de expresses matemticas envolvendo operaes matemticas, tais como adio e multiplicao. Uma rvore binria T um conjunto finito de ns os quais possuem as seguintes propriedades. O conjunto pode estar vazio; Ou o conjunto consiste em uma raiz, r, e exatamente duas rvores binrias TL e TR distintas, T = {r, TL, TR}. A rvore TL chamada subrvore de T, e a rvore TR chamada subrvore de T. rvores binrias so quase sempre consideradas rvores ordenadas. Ento, subrvores TL e TR so chamadas subrvores da esquerda e da direita, respectivamente. Para implementao de rvores binrias temos uma classe em C++ cuja hierarquia mostrada na figura 9. So inclusas General Trees, N-ary trees e Binary Trees. Os vrios tipos de rvores so vistas como classes de contineres.
Object

Ownershipe

Container

Tree

GeneralTree NaryTree BinaryTree

Figura 12 Estrutura hierrquica de classes da rvore binria

61

2.3 - Desempenho do compactador de Huffman implementado Para arquivos textos maiores que 40 KB, o compactador de arquivos implementado, apresentou uma ligeira demora na compactao, e na descompactao que tende a crescer exponencialmente com o aumento linear do arquivo. Isso porque ao compactarmos, temos que fazer sucessivas leituras na rvore de Huffman para montarmos a cadeia de caracteres. Ao descompactarmos, temos que fazer o processo inverso com a sobrecarga das comparaes com o cabealho. Constatamos um problema inerente ao Cdigo de Huffman: a complexidade de descompactao. O mtodo bsico para interpretar cada cdigo ler cada bit da seqncia. Operacionalmente, uma deciso lgica feita para cada bit. Em geral, descompactao com smbolos de tamanho varivel prov um custo/desempenho em decadncia medida que o volume de dados aumente.

2.4 - Testes realizados

Realizamos alguns teste s comparativos utilizando trs compactadores comerciais e o nosso programa que utiliza o Cdigo de Huffman, afim de que possamos comparar os ndices de compactao. Os compactadores utilizados foram: Gzip [7], Winrar [8], Winzip [9] e Huffman. Utilizamos dois arquivos para teste: Manual de Sobrevivncia.txt - um arquivo texto cujo tamanho original de 3.972 bytes - e Programa.cpp que arquivo cdigo-fonte do compactador de Huffman implementado. Os resultado obtidos esto na tabela 8.

62

Tabela 8 - Comparao ndices de compactao mdios. N Arquivo Tamanho (bytes) 1. .txt 2. .cpp 3. .log 4. .htm 5. .obj 3.972 4.105 16.497 5.419 6.642 Gzip (bytes) 1.721 1.469 1.541 1.809 2.103 WinRar (bytes) 1.827 1.529 1.578 1.879 2.205 Winzip (bytes) 1.855 1.575 1.664 1.909 2.256 Huffman (bytes) 3.715 2.557 9.842 1.075 2.450

Para o primeiro arquivo (Manual de Sobrevivncia.txt) obtivemos o melhor ndice de compactao para o programa Gzip [7], exatamente 43,33 %. Em seguida, vem o Winrar [8] com 45,50%, depois o Winzip [9] com 48,92% e o Huffman com 93,53%. Para o segundo arquivo (Programa.cpp) tivemos um ndice de compactao para o cdigo de Huffman de 62,28%. Em seguida, vem o Gzip [7] com ndice de 35,78%, depois o Winrar [8] com 37,25% e o Winzip [9] com 38,37%. Percebemos que, no primeiro caso, o Cdigo de Huffman teve um ndice de compactao em termos absoluto e relativo pior que no segundo caso. Isto se deve a dois motivos: primeiramente quanto menor a quantidade de smbolos diferentes entre si, melhor ser o ndice de compactao para o Compactador de Huffman. No o que acontece no primeiro arquivo, cujo texto est repleto de smbolos diferentes num universo total de caracteres relativamente pequeno, algo como 3.972 caracteres. Em segundo lugar, o cdigo de Huffman, estabelece a menor cadeia de bits para o smbolo que apareceu a maior quantidade de vezes. Obtemos um arquivo com ndice de compactao menor, quanto maior for a quantidade de vezes que esse smbolo aparea. Isto

63

o que ocorre num arquivo.cpp, pois neste arquivo, temos uma espantosa soma de espaos que o compactador de Huffman reduziu extraordinariamente bem.

2.5 - Aplicaes Muitos programas de compactao atualmente utilizam programas que usam Lempel-Ziv ou Huffman, ou ainda as duas tcnicas. As duas tcnicas so sem perda de dados. Em geral, Huffman o mais eficiente, porm, requer dois passos sobre os dados, enquanto Lempel-Ziv usa somente um passo. Este mecanismo de um nico passo obviamente importante no momento em que gravamos num disco rgido ou quando a decodificao ou decodificao dos dados ocorre em comunicaes em tempo real. Uma das variantes mais utilizadas o LZS, pertencente a Stac Eletronics (que foi a primeira companhia a produzir um driver compactado, chamado de Stacker). A Microsoft incluiu uma variao deste programa, chamada de DoubleSpace no DOS verso 6 e Drive-Space no Windows 95. A tcnica LZS tipicamente usada em dispositivos de recuperao de dados de massa, tais como dispositivos de fitas, onde a compactao pode tanto ser implementada em hardware como em software, o que permite que o dispositivo de fita armazene pelo menos duas vezes sua capacidade fsica. O volume de compactao depende do tipo de arquivo que est sendo compactado. Arquivos aleatrios, tais como programas executveis ou arquivos de cdigo objeto, tipicamente possuem baixa compactao, resultando num arquivo que est entre 50 a 95% do arquivo original. Ainda, imagens e arquivos de animao tendem a tem uma alta compactao e normalmente resulta num arquivo que est entre 2 a 20% do arquivo original. Devemos ressaltar que um arquivo j compactado no h virtualmente ganho algum em compact-lo novamente, a menos que uma nova tcnica seja usada.

64

Tipicamente arquivos produzidos pelo mtodo de compactao LZ77/LZ78 so ZIP, ARJ, LZH, Z, entre outros. Huffman usado em utilitrios ARC e PKARC, e em comandos UNIX. DriveSpace e DoubleSpace so programas utilizados em sistemas PC para compactao de arquivos em drives de disco rgido. Eles se utilizam de uma mistura de cdigos Huffman e Lempel-Ziv, onde o Cdigo de Huffman utilizado para diferenciao entre dados (valores literais) e o LZ usado para referncias. O Grfico de Interfaces Grficas (GIF) utiliza um algoritmo de compactao baseado no Lempel-Ziv-Welsh (LZW). Ao compactar uma imagem o programa de compactao mantm uma lista de parcelas de cadeias de caracteres foram achadas previamente. Quando uma amostra repetida encontrada, o item referido substitudo por um ponteiro ao original. Desde que imagens tendam a conter muitos valores repetidos, o formato GIF uma boa tcnica de compactao. Os programas UNIX compactam e descompactam utilizando o cdigo adaptativo de Lempel-Ziv. Esta , em geral, uma opo melhor do que os programas baseados no Cdigo de Huffman. Quando possvel, o programa de compactao adiciona um .z no arquivo compactado. Este arquivos podem ser originariamente recuperados usando o descompactador ou programas zcat. O utilitrio freeware zo baseado em UNIX aplica o algoritmo de Lempel-Ziv. Ele pode armazenar e extrair seletivamente geraes mltiplas do mesmo arquivo.

65

CONCLUSO
Como concluso de nosso trabalho ressaltamos a importncia dos compactadores. Atravs destes poderosos instrumentos que diminui o tempo de transmisso de dados e diminui o espao ocupado por arquivos. Este trabalho enfocou duas vertentes de compactadores que so utilizados atualmente: compactadores estatsticos e compactadores com dicionrios, o primeiro, representado pelo Cdigo de Huffman e o segundo, pelo LZW. Quanto ao nosso compactador Huffman implementado, vimos que existem alguns problemas que so inerentes ao prprio Cdigo de Huffman: tais como a expressiva queda na performance do compactador para arquivos grandes, e a ineficincia do cdigo ao trabalhar com rvores binrias com leituras recursivas para formao do Cdigo de Huffman e montagem da cadeia de bits e sua leitura acompanhado pela rvore de Huffman para executar o processo de descompactao. Alis, este um dos motivos pelo qual o Cdigo LZW mais usado. Em nosso compactador implementado, por exemplo, temos que para arquivos maiores que 15KB, temos uma demora de at cinco minutos para executar o processo de compactao e descompactao. Para trabalhos futuros, podemos propor a juno do Cdigo LZW e o Cdigo de Huffman numa estrutura hbrida que ser aplicada para cada tipo de arquivo em particular, aplicando um ou outro algoritmo ou os dois simultaneamente em maior ou menor proporo.

66

REFERNCIAS BIBLIOGRFICAS
[1] HELD, Gilbert, Comunicao de Dados. Rio de Janeiro: Editora Campus, 1999. [2] SZWARCFITER, J. L. & MARKENZON, L. Estrutura de dados e seus algoritmos. Rio de Janeiro: Editora LTC, 1994. [3] TERRY A. Sperry Research Center. A Technique for High-Performance Data Compression. IEEE, 1984. [4] DEITEL, H. M. e DEITEL, P. J. C++: como programar. Porto Alegre: Editora Bookman, 2001. [5] PREISS, B. R. Data Structures and Algorithms with object oriented desing patterns in C++. New York: Editora John Wiley & Sons, Inc, 1999. [6] ZIV, J. e LEMPEL A., Compression of individual sequences via variable-rate coding. IEEE Transactions on Information Theory, Vol. it-24, n 5. september 1978, 530 a 536. [7] www.gzip.org [8] www.rarlab.com [9] www.winzip.com

Você também pode gostar