Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 Alexandre Souza Francisco Mesqui5a Simoni Krüger Carla Pires Fabrício Ferreira Algoritmos e Estruturas de Dados! Definição • Representação de uma fonte de dados da maneira mais precisa possível uElizando um menor número de bits; • Fazer com que a mesma quanEdade de informação caiba em um espaço menor; • Eliminar as redundâncias: recorrências de letras, dígitos ou pixels; • Receptor deve ser capaz de decodificar os dados para acessar a informação; • Exemplos: ² EBCDIC de 8 bits para o formato ASCII de 7 bits; ² ‘AAAAAA’, que ocupa 6 bytes, poderia ser comprimida para ‘6A’, que ocupa 2 bytes ); ² AATTTT representa-‐se por: *4T (decodifica por meio de uma tabela). 2 Histórico • A compressão é oriunda da criptografia: algoritmo de compressão é um codificador e um decodificador; • Relatos de encriptação por volta de 1500 a.C. (escrita cifrada para guardar segredos); • Gregos e espartanos usavam códigos em movimentos bélicos durante as guerras (475 a.C); • No século XIX a invenção do telégrafo e do Código Morse abriu espaço para a criptografia moderna que deixou de ser processos altamente manuais; 3 Histórico • 1a Guerra Mundial (1914 a 1918): máquinas de codificação mecânicas usadas para codificar e decodificar textos usando encriptações sofisEcadas e complexas; • 2a Guerra Mundial (1939 a 1945): codificação da mensagem para esconder a informação do inimigo e reduzir a quanEdade de informações que eram passadas através dos rádios (surge a compactação de dados); • Advento dos computadores digitais: – necessidade da criação de códigos seguros e inquebráveis; – necessidade de reduzir espaço nos meios de armazenamento e transmissão de dados, reduzindo custos e viabilizando projetos. 4 Por que comprimir? • Velocidade de processamento dos computadores aumentou; Tempo de acesso a discos magnéEcos tem se manEdo praEcamente constante; • É mais vantajoso invesEr em poder de computação em compressão de dados em troca de menos espaço para armazenamento de dados em disco ou em menor tempo transmissão de dados pela rede; • Reduz custos operacionais: – OEmização do espaço em disco para armazenamento; – Redução do tráfico da rede; 5 Por que comprimir? • Internet e o uso intensivo de sistemas computacionais criaram uma necessidade incremental de armazenar e transferir grande volume dados sobre uma infraestrutura existente (redes de computadores); • Aumento da autonomia da bateria de disposiEvos portáteis devido a redução da quanEdade de dados a serem transmiEdos; • Tecnologias como telefonia 3G, fotos geradas por câmeras digitais, música digital, TV digital, bibliotecas digitais; • EsEma-‐se que em uma biblioteca digital é possível uma economia de 50 a 60% de espaço uElizando compressão de dados; • Tornou viável a aplicações de videoconferência; • Redução do espaço necessário para backups; • Emails e downloads da internet. 6 Desvantagens • Custo de processamento na compressão e na descompressão; • Custo para armazenar a tabela de símbolos ou dicionário; • Ganhos expressivos são obEdos apenas com métodos de compressão que não permitem reconstruir os dados exatamente da maneira como eram antes da compressão. 7 Técnicas Lossless • Sem perda de dados; • Permite a reconstrução exata do conteúdo original a parEr da fonte comprimida; • Explora a redundância dos dados; • Aplicável à maioria das fontes de informação: – Imagens médicas digitais; – Transmissão de textos; – Programas executáveis; – Banco de dados; – Informações bancárias. • Ex.: transformação de Burrows-‐Wheeler, codificação de Huffman, LZ77, LZ78, LZW, ZIP, RAR, ARJ, PNG, GIF, PNG. 8 Técnicas Lossless • Classificação: – Codificação estáDca: o mapeamento entre as mensagens e o conjunto de palavras-‐código é determinado antes do início da transmissão (requer duas passagens pela fonte de dados); – Codificação adaptaDva: o mapeamento entre as mensagens e o conjunto das palavras código muda com o tempo (uma única passagem sobre a fonte de dados); – Codificação híbrida: usa conceitos tanto da codificação estáEca quanto da adaptaEva. 9 Técnicas Lossy • Com perda de dados (a informação descomprimida é diferente da original); • Comprime os dados eliminando definiEvamente certas redundâncias; • Perdem-‐se dados sucessivamente, à medida em que se aplica o algoritmo várias vezes; • Explora redundâncias temporais e espaciais presentes nas fontes de dados; • Leva em consideração a percepção humana, que é incapaz de perceber certas perdas em imagens, áudio e vídeo: – Sons de frequências muito altas ou muito baixas que os humanos não ouvem; – Detalhes muito suEs como a diferença de cores; – Movimentos muito rápidos que não conseguimos acompanhar em um filme; • Taxas de compressão melhores que das técnicas lossless (50:1 a 10000:1); • Exemplos: JPEG, MPEG, DIVx, MP3. 10 Técnicas Lossy • Classificação: – Métodos de transformação: amostras de figuras ou sons são transformados em pequenos segmentos, os quais são transformados em um novo espaço base e quanEdades (limitação de possíveis valores). Os valores quanEzados são codificados para entropia (trata de cadeias de bits sem levar em conta seu significado); – Métodos prediDvos: informações decodificadas são usadas para prever qual será o próximo pacote. O erro entre o dado previsto e o dado real, junto com qualquer informação extra necessária para reproduzir a previsão, são quanEzados ecodificados. Ex.: próximo frame de imagem; – Métodos híbridos: uso de ambas técnicas. 11 1 Algoritmos e Estruturas de Dados! Histórico 2 David Albert Huffman (09-‐08-‐1925 – 07-‐10-‐1999) Codificação de Huffman O que é? É um método de compactação que usa as probabilidades de ocorrência dos símbolos no conjunto de dados a ser compactado para determinar códigos de tamanho variável para cada símbolo. 3 Codificação de Huffman 4 ObjeJvo Tem por objeDvo a construção de uma árvore binária baseada na frequência de uso das letras do a l fabeto de modo que as mais frequentemente uDlizadas apareçam mais perto da raiz. Codificação de Huffman 5 ObjeJvo Esta árvore binária é construída da baixo para cima (das folhas para a raiz) , começando a parDr das letras menos usadas até aDngir a raiz. Codificação de Huffman Etapas • Cálculo da frequência de cada caracter no arquivo • Execução do algoritmo de Huffman para construção de uma árvore binária (árvore de Huffman) • Codificação Propriamente dita 6 Codificação de Huffman 7 Como Funciona No início do algorítmo, cada uma das letras forma uma árvore que é composta apenas pela raiz e cujo conteúdo é a frequência com que esta letra ocorre no texto em questão. Em seguida, são escolhidas as duas árvores com as menores frequências associadas e elas são unidas em uma só árvore cujo valor da raíz é a soma do valor destas duas. Este processo é repeDdo até a existência de uma única árvore. Codificação de Huffman (exemplo) Sequência de caracteres: FAAFEEEAAAAEEEECCAAAAAAAAACFFCCAAAACCCBAAAB BBBAAAAAAAADDDDBBBBBBDDDDAAAAAADDDDDDAAA AEE Caracteres: FECBDA Frequência: 5 9 12 13 16 45 (respecDvamente) Dados iniciais ordenados por frequencia de ocorrência 8 F 5 E 9 C 12 B 13 D 16 A 45 Codificação de Huffman (exemplo) 9 F 5 E 9 C 12 B 13 D 16 A 45 F 5 E 9 C 12 B 13 D 16 A 45 14 Codificação de Huffman (exemplo) 10 F 5 E 9 C 12 B 13 D 16 A 45 14 F 5 E 9 C 12 B 13 D 16 A 45 14 25 Codificação de Huffman (exemplo) 11 F 5 E 9 C 12 B 13 D 16 A 45 14 25 Codificação de Huffman (exemplo) 12 F 5 E 9 C 12 B 13 D 16 A 45 14 25 30 Codificação de Huffman (exemplo) 13 F 5 E 9 C 12 B 13 D 16 A 45 14 25 30 55 13 Codificação de Huffman (exemplo) 14 F 5 E 9 C 12 B 13 D 16 A 45 14 25 30 55 100 0! 1! 0! 1! 1! 1! 0! 0! 0!1! Codificação de Huffman (Codificação) 15 A tabela de codificação resultante Caracter Huffman A 0 C 100 B 101 D 111 F 1100 E 1101 Codificação de Huffman (Codificação) 16 A tabela de codificação resultante Caracter Huffman ASCII A 0 0100 0001 C 100 0100 0011 B 101 0100 0010 D 111 0100 0100 F 1100 0100 0110 E 1101 0100 0101 Codificação de Huffman 17 Comparação entre a sequência de caracteres propostas uJlizando a codificação ASCII (8 bits) e uJlizando a codificação de Huffman. Sem compactação (ASCII) 010001100100000101000001010001100100010101000101010001010100000101000001010000010100000 101000101010001010100010101000101010000110100001101000001010000010100000101000001010000 010100000101000001010000010100000101000011010001100100011001000011010000110100000101000 001010000010100000101000011010000110100001101000010010000010100000101000001010000100100 001001000010010001001000001010000010100000101000001010000010100000101000001010000010100 100010001000100010001000100010000100100001001000010010000100100001001000010010001000100 010001000100010001000100000101000001010000010100000101000001010000010100010001000100010 00100010001000100010001000100010000010100000101000001010000010100010101000101 Com compactação 1100001100110111011101000011011101110111011001000000000001001100110010010000001001001001 0100010110110110100000000111111111111101101101101101101111111111111000000111111111111111 111000011011101 Codificação de Huffman 18 Decodificação Para decodificar uma mensagem obDda, basta ir uDlizando cada bit da mensagem para percorrer a arvore de Huffman desde a raiz até alguma folha, quando se obtém o símbolo decodificado. Volte então para a raiz e conDnue a percorrer a árvore para decodificar o próximo símbolo. 1 Algoritmos e Estruturas de Dados! Codificação Shannon-‐Fano 2 Codificação Shannon-‐Fano 3 Codificação Shannon-‐Fano 4 Codificação Shannon-‐Fano 5 ! Codificação Shannon-‐Fano 6 ! Codificação Shannon-‐Fano 7 ! Codificação Shannon-‐Fano 8 ! Codificação Shannon-‐Fano 9 ! Codificação Shannon-‐Fano 10 ! 11 Algoritmos e Estruturas de Dados! Família LZ - Compressão por Substituição Introdução Jacob Ziv e Abraham Lempel desenvolveram algoritmos para compressão de dados na década de 70; Os algoritmos Lempel-Ziv baseiam-se no princípio decompressão por substituição; Esses algoritmos usam duas estruturas: 1 Dicionário 2 Área de Pesquisa A idéia é que sempre que uma frase é repetida, na área de pesquisa, substituir a ocorrência original da frase por uma referência armazenada no dicionário. Compressão - LZW (Lempel-Ziv-Welch) Família LZ - Exploram Redundância de dados LZ77 LZSS e LZH - Variação do LZ77 LZ78 LZC, LZT e LZW - Variação do LZ78 LZW - Lempel-Ziv-Welch Desenvolvida por Terry Welch em 1984; Usa a compactação baseada em dicionário; É baseado na construção de um dicionário de símbolos a partir do fluxo de entrada; A variação introduzida foi iniciar o dicionário com todas as frases que contém apenas um símbolo no alfabeto que está sendo usado. Compressão LZW LZW - Lempel-Ziv-Welch Para se obter a codificação através do método LZW devem ser seguidos os seguintes passos: 1 Inicialize o dicionário com todos os símbolos; 2 Procure, no código a ser comprimido, pelo bloco mais longo que tenha registro no dicionário; 3 Codifique o bloco com o índice que consta no dicionário, 4 Adicione o bloco, seguido pelo próximo caractere da sequência, ao dicionário, e volte ao passo 2; 5 Parada. Para decodificar o código gerado, basta trocar os índices pelas frases a eles associadas. M. Soares, P. Martins, R. Pereira e D. Coutinho.. Funcionamento Exemplo: codificação do texto: BABABABABABAB, a partir de três símbolos (A, B, C) a tabela de sequências é inicializada com os três símbolos: A, B e C. Funcionamento Exemplo: BABABABABABAB A tabela e a informação codificada obtidas após a aplicação do algoritmo são: Aplicações que usam LZ ou variantes Notas: Unix Compression O algoritmo LZC é utilizado pelo utilitário do UNIX; GIF (Graphics Interchange Format) Muito similar ao compress do UNIX também usa LZC; Protocolo V42bis Usa uma variante do LZW (LZT); Zip e gzip usam uma variante do LZ77 combinada com Huffman; ARJ usa a codificação de Huffman e o algoritmo LZSS; Winrar usa o LZ77 e o Hufman; Winzip entre outros algoritimo usa o LZW; o LZ77 é usado no PKZIP, GZIP e no formato de imagens PNG; Notas finais Notas: LZ77 não tem patente, razão pela qual é usado em, muitos compactadores. LZ78 e LZW possuem patente; O problema básico dos algoritmos que usam dicionário é a memória usada para guardar o dicionário; Atualmente existem algoritmos com taxas de compressão significantemente melhores que os Lempel-Ziv’s, porém devido a vantajosa simplicidade computacional, este tipo de codificador ainda é largamente usado. Referências Literatura consultada M. Pasin. Uma Breve Introdução à Compressão de Dados, 2007 M. Camara. Criptografia e Compressão de Dados. 2004. M. Soares, P. Martins, R. Pereira e D. Coutinho. Compressão de Dados com o Algoritmo Lempel-Ziv: Um caso Estudado. 2002. A. L Brasil. O Algoritmo LZW 1 Algoritmos e Estruturas de Dados! Algoritmos de codificação (LZSS) baseada em dicionário sem perda de dados; Codificação de sequências vs codificação de símbolos; 2 Algoritmos Adaptados 1977 • LZ77 : Jacob Ziv e Abraham Lempel; 1978 • LZ78 : por Jacob Ziv e Abraham Lempel; 1982 • LZSS: Storer e Szymanski; 1984 • LSW : Terry Welch; 3 Algoritmos Adaptados 4 LZ77 • O Dicionário contém os símbolos já codificados; • O look-ahead contém os símbolos a serem codificados, “janela futura”; • “Janela deslizante” de dimensão fixa. Procura-‐se uma cadeia a parSr do primeiro caracter da janela futura que também esteja presente na janela de texto. Sendo encontrada alguma coincidência, a cadeia passa a ser codificada em um bloco de três parâmetros (i, n, p). i -‐ Posição do inicio da cadeia na janela de texto; n-‐ O comprimento da cadeia; p-‐ Primeiro caracter da janela futura após o fim da cadeia. 5 LZ77 • A dimensão do dicionário condiciona até onde se pode pesquisar; • A dimensão do look-‐ahead, janela futura, condiciona a máxima dimensão da sequência a codificar; • Se aumentar o tamanho da janela futura, maior compressão "vantagem", por exemplo, de 128 caracteres para 1024, torna-‐se oito vezes mais lento. • É ineficiente pesquisar com frases de 2 ou menos símbolos (devido aos bits gastos para o índice e dimensão da frase); 6 Deficiências do Algoritmo LZ77 Abraham Lempel e Jacob Ziv evoluíram LZ77. Novo algoritmo LZ78, criando uma estrutura em árvore, onde cada nó pode possuir um número de ramificações igual ao comprimento do alfabeto uSlizado. 7 LZ78 8 Compressão LZSS Variante do LZ77 e LZ78 proposta por Storer e Szymanski em 1982.! ! Na codificação! ! ü Não inclui o símbolo que se segue à frase na área !de look-ahead, janela futura.! ! ü Usa dois formatos:! ! ! !- Um token com (n, i), ou! !- Só um símbolo.! ! ü Usa um bit extra para distinguir os dois formatos.! ü Sempre que a frase a codificar já existir no dicionário e o !número de elementos coincidentes for pelo menos 3 é !usado o primeiro formato, senão é!usado o segundo. ! 9 Descompressão O processo de decodificação.! ! • !Reverso do processo de codificação, usa uma tabela buscando o !apontador do dicionário da palavra-código entrada.! • !Ao mesmo tempo, o dicionário cresce de forma idêntica àquele !do codificador. ! • !Descodificação sem perda em virtude da propriedade do prefixo !do dicionário garantir.! • !São limitado o número de caracteres que podem ser enviados !para o decodificador em um código.! • !Decodificador pode ser determinístico, predizer o dicionário do !codificador conforme as palavras-código entradas.! 10 Aplicação ! ! ! O Zip e o gzip usam uma variante do LZ77 combinada com Huffman estático.! ! ! O ARJ usa a codificação de Huffman e o algoritmo LZSS.! ! ! ! O WINRAR usa o LZ77 e Huffman.! ! ! ! 11 Burrows-‐Wheeler O método de compressão de Burrows-Wheeler foi descrito em 1994.! ! Ele é baseado em uma pesquisa (não publicada) de Wheeler em 1983. ! ! Sendo uma combinação de três algoritmos: ! ! • !Uma função de transformação BWT, que reordena os bytes !originais, tornando-os bastante propícios para compressão. ! • Aplica uma função heurística MTF. Faz com que os !dados de !saída contenham muitos zeros e grande tendência para !números positivos pequenos. ! • Por fim submete os dados resultantes a algum método de !compressão que atue sobre estatísticas dos dados !(por !exemplo, código de Huffman).! " ! ! 12 Burrows-‐Wheeler ! Descrição do algoritmo "Burrows-Wheeler Transform“! ! • !Diferente dos algoritmos da família "LZ", o BWT opera em blocos !de dados.! • !Quanto maior o tamanho dos blocos, maior a taxa de !compressão atingida.! ! Ideia básica: dada uma sequência S de n símbolos, reordenar os símbolos formando outra sequência L, que verifica duas condições:! ! • A probabilidade de um símbolo ser igual ao anterior é muito elevada;! • É possível reconstruirS a partir de L.! ! ! ! 13 Aplicação ! ! ! ! ! O método de Burrows-Wheeler foi difundido principalmente pelo utilitário de compactação de dados bzip2.! ! É utilizado em:! ! • Imagens;! • Sons;! • Texto.! ! Conclusões • A compressão de dados surgiu das pesquisas de criptografia; • A compressão sem perdas permite a recuperação total dos dados originais, contudo apresenta baixa taxa de compressão se comparada aos métodos com perdas; • Para que comprimir? – Para redução do espaço =sico u>lizado; – Para agilização na transmissão de dados. • Com o advento dos computadores digitais, a compactação de dados passou a ser obrigatória; • Compressão baseada em dicionário possuem as técnicas mais eficientes. 1 OBRIGADO! PERGUNTAS? 2
Compartilhar