You are on page 1of 17

3

1. Introdução

Este trabalho consiste em um estudo teórico e prático sobre o tema “compressão


de dados”. A pesquisa foi concebida a partir de uma proposta de trabalho interdisciplinar
do curso de Sistemas de Informação da Pontifícia Universidade Católica de Minas Gerais,
unidade Betim. O trabalho foi realizado por um grupo de cinco pessoas, todas cursando
algumas matérias comuns do terceiro período.
Tendo a escolha do tema ficado a cargo dos alunos, passamos por diversos temas
até chegarmos a um consenso. A idéia de aprofundarmos um pouco mais no estudo da
compressão de dados foi, então, a opção do grupo, tanto pelo interesse quanto pelo
desafio que o assunto nos oferecia. Entretanto, também desejávamos fazer algo de
prático.
Assim, pretendíamos, além de proceder a estudos teóricos, elaborar uma
implementação do método LZW na linguagem C++. No decorrer do trabalho, percebemos
que essa era uma tarefa fora de nossas possibilidades técnicas e dos prazos que tínhamos
para cumprir. Entendemos, a partir daí, que poderíamos implementar, na mesma
linguagem, um outro método de compressão de dados, que fosse igualmente
interessante, mas que estivesse ao nosso alcance, dadas as questões já mencionadas.
Optamos, assim, pelo método de codificação run length, ou run length encoding – RLE.
Constam aqui os resultados aos quais chegamos. Apresentamos desde informações
mais gerias sobre a compressão de dados, passando por seus fundamentos, pelas
classificações correntes dos métodos de compressão, por esclarecimentos sobre a
terminolgia utilizada até informações de cunho mais específico, referentes à
implementação realizada.
4

2. Compressão de dados

2.1. Aspectos gerais

No decorrer de sua história, o homem criou vários artifícios para estabelecer a


comunicação. Dentre esses exemplos, podemos citar o Sistema Braille1 e o Código Morse2.
Ambos têm que lidar com uma determinada economia de símbolos para otimizar e
efetivar a comunicação. Isso nos indica que a idéia da compressão de dados surge
espontaneamente ao falarmos em comunicação.
Além disso, as pessoas, de um modo geral, gostam de acumular dados e não jogam
nada fora. Como exemplo, basta que pensemos nos discos rígidos dos computadores
domésticos, que, de tempos em tempos, percebemos estarem ocupados quase que
totalmente. Nesses casos, a compressão de dados surge como um meio de atrasar essa
aparente inevitabilidade.
Outro ponto que evidencia a popularidade da compressão de dados é o fato de
buscarmos agilidade máxima nas transferências de dados. Poucos segundos diante da tela
do computador aguardando o carregamento de uma página da internet nos parece um
tédio.

1
De acordo com o site “Braille Virtual”, da Universidade de São Paulo – USP, o Sistema Braille é um código
universal de leitura tátil e de escrita, usado por pessoas cegas. Foi desenvolvido na França por Louis Braille,
um jovem cego, a partir do sistema de leitura no escuro, para uso militar, de Charles Barbier. Utilizando seis
pontos em relevo dispostos em duas colunas, possibilita a formação de 63 símbolos diferentes, usados em
literatura nos diversos idiomas, na simbologia matemática e científica, na música e mesmo informática.
2
Conforme artigo da Wikipédia, o Código Morse é um sistema de representação de letras, números e sinais
de pontuação. Essa representação se dá através de uma sequência de pontos, traços e espaços.
5

2.2. Fundamentos

Conforme Salomon (2000), a compressão de dados só é possível porque,


normalmente, os dados são representados nos computadores em um formato maior do
que o que seria absolutamente necessário. A razão do uso dessa representação
“ineficiente” se deve ao fato de que ela torna mais rápido o processamento de dados, que
é mais comum do que a compressão de dados.

A tabela ASCII para caracteres é um bom exemplo de uma


representação de dados que é maior do que o absolutamente necessário. Ela
usa códigos de 7 bits porque é mais fácil de se trabalhar com códigos de
tamanho fixo. Um código de tamanho variável, entretanto, seria mais eficiente,
uma vez que certos caracteres são usados mais do que outros e, então, lhes
poderiam ser atribuídos códigos menores. (SALOMON, 2000, p.3)

Há diferentes métodos para compressão de dados. Contudo, todos se baseiam no


mesmo princípio, o de comprimir os dados eliminando a redundância do dado original.
Assim, pode ser identificada uma lei geral da compressão de dados: atribuir códigos curtos
para eventos comuns (símbolos ou frases) e códigos longos para eventos raros.
(SALOMON, 2000, p.2).
6

2.3. Métodos de compressão de dados: classificações

Embora baseados nesse princípio norteador – o da eliminação da redundância – os


métodos de compressão têm especificidades que os diferem uns dos outros. Em sua
maioria são classificados em quatro categorias: run legth encoding (RLE), métodos
estatísticos, métodos baseados em dicionários e transformacionais.
A codificação run length (RLE) é uma técnica utilizada para a compressão de
cadeias de caracteres nas quais haja redundância. Para que funcione adequadamente, os
caracteres redundantes devem estar dispostos de maneira contígua.
Os métodos estatísticos se baseiam nas probabilidades de ocorrências dos
símbolos e alteram a representação original desses. Assim, os que ocorrem com maior
frequência passam a ser representados por um conjunto de bits de menor valor, enquanto
que os símbolos que ocorrem menos vezes são representados por um conjunto de bits
maior. Um exemplo é a codificação de Huffman.
Por sua vez, os métodos baseados em dicionário são aqueles que utilizam de
estruturas semelhantes a um dicionário como meio de diminuir a redundância de
símbolos. O algoritmo LZW (Lempel-Ziv-Welch) pode ser citado como exemplo.
Finalmente, os métodos tranformacionais não efetuam a compressão por si
mesmos, mas justamente transformam os dados, de modo que esses sejam mais
facilmente ou melhor comprimidos.
Os métodos ainda podem ser classificados como adaptativos ou não-adaptativos,
de compressão com perda ou sem perda e simétricos ou assimétricos.
Os métodos adaptativos examinam o dado “cru” e modificam suas operações e/ou
parâmetros de acordo com o exame realizado. A codificação de Huffman, citada acima,
opera segundo essa lógica. Os não-adaptativos, a seu turno, são rígidos e não modificam
suas operações, parâmetros ou tabelas em resposta ao dado particular que está sendo
comprimido.
7

São chamados sem perda os métodos que comprimem sem provocar perda de
informações. Havendo descompressão, os dados retornam à sua forma original. Existem
outros, porém, que alcançam melhor compressão pela perda de informações, os métodos
de compressão com perdas. Cabe ressaltar que esses não são úteis em uma série de
contextos nos quais a integridade da informação é fundamental, a saber, fotos periciais e
determinados exames médicos.
Os simétricos caracterizam-se pela utilização, tanto no compressor quanto no
descompressor, basicamente, do mesmo algoritmo, porém, em direções em direções
opostas. Nos assimétricos, compressor e descompressor trabalham diferentemente.
8

2.4. Terminologia

O estudo da compressão de dados envolve uma terminologia própria que


pretendemos esclarecer, brevemente, nesse tópico.
O compressor ou encoder é o programa que comprime o dado original, “cru”.
O descompressor ou decoder realiza a conversão na direção oposta, ou seja, desfaz
o trabalho do compressor, reconstitui os dados à sua forma original.
O codec, termo bastante conhecido, é a soma do encoder e do decoder,
executando as duas tarefas, compressão e descompressão.
9

3. Programa: codificação run length – RLE

Nesse item trataremos dos aspectos que nos guiaram na escolha do método de
compressão de dados que implementamos, bem como sobre o funcionamento do
programa, do ponto de vista do programador e também do usuário.
O programa foi idealizado como sendo uma possibilidade de fazermos, além do
estudo teórico, um trabalho prático que envolvesse a compressão de dados.
Primeiramente, a idéia que tínhamos era a de trabalhar com o algoritmo LZW. Entretanto,
fatores como prazo insuficiente e a falta das habilidades técnicas necessárias para que
obtivéssemos um resultado satisfatório, nos fizeram buscar outro método de compressão
de dados para realizar o trabalho. Assim, elegemos a codificação run length.
Dito de maneira breve, a codificação run length opera substituindo cadeias de
caracteres, contíguos e redundantes, por uma cadeia menos que represente
adequadamente a original. Por exemplo, se um dado “d” ocorre “n” consecutivas vezes
em um fluxo de entrada, troca-se as “n” ocorrências pelo par “nd”. É comum a inserção de
um marcador antes do par, como “$nd”, para indicar que o trecho da cadeia está
comprimido.

3.1. Objetivo do programa

O programa tem o objetivo de comprimir, através da codificação run length, uma


massa de dados numérica, gerada aleatoriamente por ele mesmo.
10

3.2. Funcionamento do programa – informações técnicas

O programa foi desenvolvido na linguagem c++ e compilado utilizando o


Code::Blocks e o compilador GNU GCC Compiler. Grosso modo, está estruturado em
funções que são ativadas a partir das escolhas do usuário no menu de opções. Nesse
menu, o sistema garante que o usuário siga os passos na ordem necessária para um
perfeito funcionamento do programa.
A execução do programa tem início com a geração aleatória de uma massa de
dados de 100.000 números inteiros, entre 0 e 9. A partir daí, essa massa é listada e, então,
ordenada para que haja uma maior compressão dos dados, uma vez que a codificação run
length trabalha com a redundância disposta contiguamente. Feito isso, realiza-se a
compressão dos dados.
Para gerar a massa de dados, cria-se um arquivo no mesmo diretório em que
esteja o executável, com o nome de “MassaDeDados.dat”. Gerados os valores através das
funções “srand()”, “rand()” e do comando “for”, eles são salvos em disco e o arquivo é
fechado.
A função que lista a massa de dados abre o arquivo que foi salvo anteriormente no
mesmo diretório do executável e, por meio de uma estrutura de repetição, lê os números
até o fim do arquivo. O arquivo é fechado e, por fim, é informada ao usuário a quantidade
de números lidos.
No que diz respeito à ordenação, utiliza-se um método de ordenação externa, por
intercalação. Primeiramente percorre-se o arquivo quebrando-o em blocos. Cada bloco é,
então, ordenado na memória principal e, depois, são intercalados. As operações de
distribuição em blocos e intercalação continuam e, o tamanho dos blocos aumenta
exponencialmente – enquanto o fator de blocagem for menor do que o número de
registros, no caso, 100.000. Atingida essa etapa, o arquivo está perfeitamente ordenado.
Finalmente, a compressão se dá evitando que a mesma informação seja
armazenada várias vezes. Para tanto, os valores que aparecem mais de três vezes
11

consecutivas são definidos pela cadeia, genericamente, “$nd”, a saber, “$” indicando que
seguirá uma sequência que foi comprimida e “n” o número de repertições de um
determinado caractere, “d”. Ao fim, é gerado um novo arquivo, já comprimido, chamado
“MassaDeDadoPress.dat” e é exibido ao usuário o número de ocorrências de todos os
caracteres.

3.3. Funcionamento do programa – informações para o usuário

No que tange à interface com o usuário, o programa apresenta um menu com as


opções “Gerar Massa de Dados”, “Lista Massa de Dados”, “Ordenar Massa de Dados”,
“Comprimir Massa de Dados”, “Créditos” e “Sair”.
Após executado, digitada a opção "1" o programa gera aleatoriamente 100.000
números inteiros, situados entre 0 a 9, e salva-os em um arquivo de nome
“MassaDeDados.dat”, localizado no mesmo diretório em que está o arquivo “.exe”.
O segundo item é opcional, o usuário pode ou não listar a massa de dados gerada
anteriormente.
A opção "3" ordena de forma crescente os 100.000 números gerados na opção "1".
Para finalizar, a opção "4", quando informada, imprime toda a listagem já
ordenada e posteriormente realiza a compressão dos dados. Imprime, ainda, o número de
ocorrências de cada número no arquivo original.
A opção "5" informa os créditos do trabalho e a de número “0” encerra o
programa.
12

4. Considerações Finais

Com a realização desse trabalho, pudemos perceber que compressão de dados


ocupa um lugar importante na computação. O status advém da possibilidade que ela cria
de ocupar menos espaço no armazenamento de dados e, em decorrência, otimizar as
transferências de dados. Após indicar uma variedade de tipos de métodos de compressão
existentes da atualidade, verificamos o alto grau de compressão, economizando espaço e
tempo, numa possível transferência de dados, que a codificação run length pode nos
proporcionar, dependendo do conjunto de dados que desejamos tratar. Além disso, deve
ser evidenciada a relativa facilidade de implementação do método RLE.
De um modo geral, o trabalho em grupo nos colocou desafios, mas também a
chance de formar uma equipe. Assim, conseguimos compartilhar discussões e tarefas, o
que, sem dúvida, foi fundamental para um bom andamento das atividades. Por seu
caráter interdisciplinar, o trabalho ainda nos permitiu fazer conexões entre as disciplinas
em curso. Todas contribuíram, evidentemente, pelo estímulo do pensamento, ao estudo e
à solução de problemas. Algumas, em especial, tiveram influência mais direta na
realização desse trabalho.
O curso de Projeto de Algoritmo nos indicou questões importantes como a reflexão
sobre a estrutura de arquivo, sobre a organização de arquivos para otimizar o
desempenho – compressão de dados, e os métodos de ordenação externa, assuntos até,
então, desconhecidos por todos nós.
Ao desvendar a Arquitetura e Organização de Computadores fomos capazes de
compreender que o software não pode se desvincular do hardware, no sentido de
compreender seu funcionamento – potencialidade e limitações. Embora apresente um
desenvolvimento notável na ampliação da capacidade de armazenamento dos discos
rígidos e no processamento dos dados, o aproveitamento inteligente dos recursos de
hardware constitui peça fundamental para a aplicação da computação em diversas áreas.
13

Finalmente, estudar Introdução à Pesquisa em Sistemas de Informação contribuiu


para que delimitássemos melhor o escopo do nosso trabalho, conseguíssemos fontes
seguras de pesquisa e entendêssemos a necessidade e como estruturar adequadamente
os trabalhos acadêmicos.
14

Referências

BOTELHO, Fabiano C.; ZIVIANI, Nívio. Ordenação. [online]. Disponível em:


<http://www.dcc.ufmg.br/algoritmos/cap4/transp/completo4/cap4.pdf>. Acessado em 28
de maio de 2010.

CÓDIGO MORSE. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2010.
Disponível em:
<http://pt.wikipedia.org/w/index.php?title=C%C3%B3digo_morse&oldid=20222618>.
Acessado em 28 maio 2010.

FOLK, Michael J.; ZOELLICK, Bill; RICCARDI, Greg. File structures: an object-oriented
approach with C++. Reading: Addison Wesley, 1998. 724p.

GARCIA, Nely. Sobre o Sistema Braille. [online]. Disponível em:


<http://www.braillevirtual.fe.usp.br/pt/index.html>. Acessado em 28 de maio de 2010.

SALOMON, D. Data compression: the complete reference. 2nd ed. New York: Springer-
Verlag, c2000. 821p.

SOUZA, Cid C. de. Ordenação externa. [online]. Disponível em:


<http://www.ic.unicamp.br/~mc202abcd/4pp-external-sort.pdf>. Acessado em 28 de
maio de 2010.
15

Anexos

Manual de Instruções

Para executar o programa, basta abrir com um click duplo o executável TIvFinal

Após aberto, irá aparecer a seguinte tela:

Nessa tela, existem 6 opções, dentre elas, estão disponíveis nesse primeiro passo
apenas as opções:
1 – Gerar Massa de Dados
5 – Créditos
0 – Sair
Escolhendo a opção 1 – Gerar Massa de Dados, será apresentado um texto com
confirmação da geração do arquivo.
16

Basta pressionar qualquer tecla que será apresentado o menu inicial novamente.
Agora estão disponíveis as opções 2 – Listar Massa de Dados e a 3 – Ordenar Massa de
Dados.

Em qualquer momento no menu principal, se pressionado a opção 0, ocorre o


encerramento do programa. Também, se pressionada uma opção que não está disponível,
será apresentada uma mensagem de erro e retornado ao menu principal.
Escolhendo a opção para 2 - Listar Massa de Dados, serão apresentados todos os
números gerados, e por fim, uma mensagem aguardando pressionar uma tecla para
retornar ao menu principal.
17

Quando retorna-se ao menu principal, a opção que estará disponível é para


ordenar os vários números gerados anteriormente. Para isso, basta pressionar a opção 3 –
Ordenar Massa de Dados, que o processo será executado sem intervenção do usuário.
Para finalizar basta pressionar qualquer tecla para retornar ao menu principal.

A opção agora disponível, e a função principal do software é a 4 – Comprimir


Massa de Dados. Quando selecionada, será solicitada o pressionamento de alguma tecla
para iniciar o processo. Nessa etapa serão listados todos os números ordenados.
18

Listados os números ordenados, será impresso na tela o resultado da


compactação, como abaixo:

Pressionado qualquer tecla, será retornado ao menu principal.


Nesse momento o processo de Gerar, Listar, Ordenar e Comprimir estará
disponível para uma nova execução. Também estão disponíveis o menu 5 – Créditos onde
são listados os nomes dos responsáveis do software e também a opção 0 – Sair do
Programa (Retornar para o Sistema Operacional).
19

You might also like