Você está na página 1de 7

Universidade Federal de Pelotas

Centro de Engenharias
Engenharia Eletrnica
Disciplina de Sistemas de Comunicaes II

COMPACTADOR E DECOMPACTADOR DE
TEXTO TIPO
LEMPEL-ZIF (LZW).

Carlos Caldern Aller

Data: 02/12/2014

PRINCIPIO DE FUNCIONAMIENTO:
O algoritmo Lempel-Ziv-Welch um algoritmo de compresso de dados sem
perdidas. Este algoritmo procura substituir sequncias de smbolos por cdigos. Para
obter a compresso de dados, os cdigos devem ser menores que as seqncias
representadas por eles. Na prtica, esse algoritmo consegue um maior nvel de
compresso de dados.
baseada na construo de um dicionrio de frases (grupos de um ou mais
caracteres) a partir do fluxo de entrada. Quando uma nova frase encontrada ela
adicionada ao dicionrio. Se a frase encontrada j foi registrada ela substituda pelo
cdigo no dicionrio.

Pseudocdigo de compactao: (Fonte: Wikipedia.)


1. No incio o dicionrio contm todas as razes possveis e I vazio;
2. c <= prximo caractere da sequncia de entrada;
3. A string I+c existe no dicionrio?
a. se sim,
i. I <= I+c;
b. se no,
i. coloque a palavra cdigo correspondente a I na sequncia
codificada;
ii. adicione a string I+c ao dicionrio;
iii. I <= c;
4. Existem mais caracteres na sequncia de entrada ?
a. se sim,
i. volte ao passo 2;
b. se no,
ii. coloque a palavra cdigo correspondente a I na sequncia
codificada;
iii. FIM.

Pseudocdigo de descompactao: (Fonte: Wikipedia.)


1. No incio o dicionrio contm todas as razes possveis;
2. cW <= primeira palavra cdigo na sequncia codificada (sempre uma raiz);
3. Coloque a string(cW) na sequncia de sada;
4. pW <= cW;
5. cW <= prxima palavra cdigo da sequncia codificada;
6. A string(cW) existe no dicionrio ?
a. se sim,
i. coloque a string(cW) na sequncia de sada;
ii. P <= string(pW);
iii. C <= primeiro caracter da string(cW);
iv. adicione a string P+C ao dicionrio;
b. se no,
i. P <= string(pW);

ii. C <= primeiro caracter da string(pW);


iii. coloque a string P+C na sequncia de sada e adicione-a ao
dicionrio;
7. Existem mais palavras cdigo na sequncia codificada ?
a. se sim,
i. volte ao passo 4;
b. se no,
i. FIM.

Esta tcnica boa para compresso de arquivos textos, onde temos uma grande
repetio de frases. Usado para compactar arquivos binrios em geral, a exemplo das
imagens, vdeos e dos textos.

CODIGO FONTE PARA MATLAB:


texto=input(''); % Intruducir cadena
diccode=' abcdefghijklmnopqrstuvwxyz'; %caracteres posibles para codificar

for SEG=1:length(diccode) %Actualiza diccionario si hay caracteres posibles


dicnuevo(SEG)={diccode(SEG)};
end
inicial=texto(1); %caracter inicial
I=inicial;
SEG=1;
%para coger siguiente caracter
COD=1;
%aadir nuevo codigo
OUT=1;
%salida codigo
x=0;
%no repetir
while strfind(diccode,texto(SEG)) %si J est en diccode
C=texto(SEG+1); %carga nuevo caracter
if C~='.' %si C est en diccode
if strcmp(strcat(I,C),dicnuevo)==0 %si I+C existe ya tiene codigo en el dic.
dicnuevo(COD+length(diccode))={strcat(I,C)}; %aadir nuevo codigo al dic.
ok=strcmp(dicnuevo,I); %comprobar que est denrto
for dentro=1:length(ok)
if ok(dentro)==1
codigo(OUT)=dentro; %Aadir codigo
OUT=OUT+1;
break;
end
end

I=C;
SEG=SEG+1; %Siguiente caracter
COD=COD+1; %aadir nuevo codigo al dicc.
x=x+1;
else
I=strcat(I,C); %combinar pareja
SEG=SEG+1; %avanzar
end
else
ok=strcmp(dicnuevo,I); %comprobar que todo caracter tiene su codigo
for dentro=1:length(ok)
if ok(dentro)==1
codigo(OUT)=dentro;
OUT=OUT+1;
codigo(OUT)=0; %finalizar codigo con 0.
end
end
break;
end
end
ldic=length(diccode); %Diccionario totalmente actualizado
texto='';
dic=cellstr(diccode);
for SEG=1:length(diccode) %Comprobar que est en el diccionario
dic(SEG)={diccode(SEG)};
end
letra=1;
convertir=char(diccode(codigo(1))); %Cargar primer codigo creado
letra=letra+1; %Siguiente codigo
while codigo(letra)~=0 %conversin a caracteres
I=convertir;
convertir=char(dic(codigo(letra)));
texto=strcat(texto,I); %string
ldic=ldic+1; % Siguiente entrada del diccionario
dic(ldic) = {strcat(I,convertir(1))}; %Actualizar diccionario
letra=letra+1; % Siguiente codigo
end
texto=strcat(texto,convertir) %texto final
display(dicnuevo);
display(codigo);
display('texto inicial:');
disp(texto);

EXEMPLOS:
1)
>> COMPACTADOR
'abcdab.'
texto =
abcdab

dicnuevo =
Columns 1 through 13
''

'a'

'b'

'c'

'd'

'e'

'f'

'g'

'h'

'i'

'j'

'k'

'l'

Columns 14 through 26
'm'

'n'

'o'

'p'

'q'

'r'

's'

't'

'u'

'v'

'w'

'x'

'y'

Columns 27 through 31
'z'

'ab'

'bc'

'cd'

'da'

28

codigo =
2

texto inicial:
abcdab
>>
2)
>> COMPACTADOR
'carlos calderon aller.'
texto =
carloscalderonaller

dicnuevo =
Columns 1 through 13
''

'a'

'b'

'c'

'd'

'e'

'f'

'g'

'h'

'i'

'j'

'k'

'l'

Columns 14 through 26
'm'

'n'

'o'

'p'

'q'

'r'

's'

't'

'u'

'v'

'w'

'x'

'y'

Columns 27 through 37
'z'

'ca'

'ar'

'rl'

'lo'

'os'

'sc'

'cal'

'ld'

'de'

'er'

Columns 38 through 43
'ro'

'on'

'na'

'al'

'll'

'le'

codigo =
Columns 1 through 15
4

19

13

16

20

28

13

6 19

16 15

13

Columns 16 through 18
13

37

texto inicial:
carloscalderonaller
>>
3)
>> COMPACTADOR
'a frase encontrada j foi registrada ela substituda pelo cdigo no dicionrio.'
Index exceeds matrix dimensions.
Error in COMPACTADOR (line 74)
end
>>
4)
>> COMPACTADOR
'Carlos Caldern Aller?.'
Undefined function 'codigo' for input arguments of type 'double'.
Error in COMPACTADOR (line 64)
convertir=char(diccode(codigo(1))); %Cargar primer codigo creado
>>

CONCLUSES:
O algoritmo de LZW tem grandes vantagens para codificaes de informao.
Ele produza o se cdigo sobre o tempo e atualiza para ficar ainda mais com menor
espaceio.
O cdigo fonte precisa de certas melhoras nas codificaes, j que precisa de
muito espaceio com entradas de texto longes, no consegue reconhecer certos caracteres
ou smbolos, e o intervalo entre palavras ainda no foi conseguido mas pode ser mais
simplex de codificar.

Você também pode gostar