Documente Academic
Documente Profesional
Documente Cultură
Alfabetul,
Setul:
ce este un set (binar) de cuvinte , unde ‚’ci’ este un cuvant de cod pentru ’ai’,
Telul: dorim ca :
sa fie
1
pentru orice cod
Exemplu
Pentru orice cod unic decodabil, suma tuturor posibilitatilor simbolurilor este
intotdeauna mai mica sau egala cu 1. In acest exemplu, suma este strict egala cu 1, deci ca
rezultat avem un cod numit si cod complet. Daca nu este cazul de asa ceva, se poate
intotdeauna deriva un echivalent al codului, prin adaugarea de simboluri cu probabilitate nula,
pentru a face codul complet.
Asa cum a definit Shanon in 1948, continutul de informatie h (in biti) al fiecarui
simbol ai cu probabilitate nenula este:
2
codat (doar daca lungimea mesajului A este infinita, dar in acest caz probabilitatile
simbolurilor au o probabilitate pozitiva infinit zecimala).
Simbol Cod
a1 0
3
a2 10
a3 111
a4 110
Proprietati
Codarea Huffman este optimala atunci cand probabilitatea fiecarui simbol de intrare este o
putere negativa a lui 2. Codurile fara prefix, au tendinta de a fi usor ineficiente, pe alfabete
reduse, unde probabilitatile cad deseori intre punctele optimale.
Cel mai defavorabil caz pentru codarea Huffman se poate intampla atunci cand probabilitatea
unui simbol depaseste 2-1 = 0.5, atingand astfel limita superioara a granitei de ineficienta. In
aceste situatii de obicei se foloseste codarea RLE. Codarea aritmetica produce rezultate usor
mai bune, dar in practica rareori au fost cu atat mai bune cat sa merite sacrificarea unei puteri
mai mare computationare si de plata a patentelor detinute din iulie 2006 de catre IBM.
Variatii
Exista multe variatii ale codului Huffman. Iata cateva dintre acestea:
4
clc;
clear clc;
clear all;
fid=fopen('text.txt','r');
secventa=fread(fid,'*char');
fclose(fid);
secventa=reshape(secventa,1,length(secventa));
Se verifica daca vectorul cu caracterele ce apar in mesaj este nul. Daca valoarea
de adevar este „1” se va parcurge instructiunea ’if’.
if ~isempty(caracter)
Se verifica daca variabila ’huff’ este nula. Daca nu este nula se va parcurge
instructiunea ’if’. Liniile de cod urmatoare au rolul de a afisa pentru fiecare caracter
unic atat probabilitatea de aparitie a acestuia cat si codul.
if ~isempty(huff)
lp=length(p);
for i=1:lp
string=huff(i).simbol;
string=strcat(string,' -> ');
string=strcat(string,num2str(huff(i).probabilitate));
string=strcat(string,' -> ');
string=strcat(string,huff(i).codul);
disp(string);
end
5
end
end
disp(char(secvcod));
Primul element din caracter va fi retinut din vectorul „secventa”. Prin urmare
numarul de aparitii al acestuia va fi minim 1.
caracter(1)=secventa(1);
p(1)=1;
l=length(secventa); % l = lungimea mesajului
k=2;
for i=2:l
indice=find(secventa(i)==caracter);
6
Probabilitatile obtinute vor fi rotunjite la 5 zecimale prin urmatoare comanda:
p=roundn(p,-5);
else
caracter=[];
p=[];
end
suma=sum(p);
end
suma=sum(p);
lc=length(caracter); % lungime caracter
lp=length(p); % lungime probaparitie
if lc==lp && suma~=1
k=(length(p)-1);
7
m=zeros(lp,k);
m(1:length(pdesc1),1)=pdesc(1,:)';
Intru-cat vom avea nevoie de probabilitatile nou obtinute prin insumare le vom
salva in vectorul „s”, iar indicii(pozitiile) acestora vor fi scrisi in vectorul „is”,folosind
instructiunea „find”.
s(i)=paux(laux-1);
paux=sort(paux,'descend'); % se sorteaza 'paux' descrescator
pdesc1=paux; % pdesc1 ia valorile lui 'paux'
auxiliar=pdesc1'; % fie vectorul 'auxiliar'
m(1:length(auxiliar),i+1)=auxiliar(:,1); % se copiaza in
matrice,pe coloana, elementele corespunzatoare fiecarei etapa de reducere.
is(i)=find(pdesc1==s(i), 1, 'last'); % fie 'is' vectorul cu
indicii sumelor corespunzatoare fiecarei etapa
end
coduri(1:lp,1:k)={''};
% matrice de coduri de dimensiunea matricei 'm' : {''} {''} ... {''} {''}
. .
. .
{''} ... ... {''}
if(m(1,k)> m(2,k))
coduri(1,k)=strcat('1',coduri(1,k));
coduri(2,k)=strcat('0',coduri(2,k));
else
coduri(1,k)=strcat('0',coduri(1,k));
coduri(2,k)=strcat('1',coduri(2,k));
end
8
while c<=lp
for j=1:c
if (j<=c-2)&&(is(lis)==1)
coduri(j,k-1)=coduri(is(lis)+j,k);
elseif (j<=c-2)&&(j<is(lis))
coduri(j,k-1)=coduri(j,k);
elseif (j<=c-2)&&(j==is(lis));
coduri(j,k-1)=coduri(j+1,k);
elseif (j<=c-2)&&(j>is(lis))
coduri(j,k-1)=coduri(j+1,k);
elseif j<=c-1
coduri(j,k-1)=coduri(is(lis),k);
coduri(j,k-1)=strcat(coduri(j,k-1),'1');
else
coduri(j,k-1)=coduri(is(lis),k);
coduri(j,k-1)=strcat(coduri(j,k-1),'0');
end
end
c=c+1;
lis=lis-1; % se decrementeaza 'lis' ( lungimea vectorului cu
indicii probabilitatilor obtinute prin insumare )
k=k-1;
end
Scurta descriere a obtinerii matricii de coduri : tinem cont ca ultimele doua
probabilitati din fiecare coloana(etapa) au algoritm de determinare a codurilor separat.
Pentru primele C-2 linii procedam astfel: luam fiecare probabilitate din coloana „K” si
verificam daca pe aceeasi pozitie in coloana anterioara „K-1” se afla probabilitatea
obtinuta prin insumare. Daca pe linia care lucram,in coloana din etapa anterioara, nu se
intalneste probabilitatea obtinuta prin insumare, atunci codurile se rescriu din coloana
„K-1”. In momentul cand ajungem pe linia unde se afla si probabilitatea obtinuta prin
insumare(linia „is(lis)”) atunci codurile se scriu tot din coloana „K-1”,insa decalate cu 1
unitate, pentru a sari peste probabilitatea insuma. Procedeul continua pana ajungem la
ultimele doua elemente de pe coloana/etapa curenta:”C-1 si ”C”, caz in care se scrie
codul probabilitatii insumate din etapa anterioara si se concateneaza la cod cifra „1”
pentru penultimul element si „0” pentru ultimul.
9
coduri=cellstr(coduri(:,1));
[index1 index2]=sort(ipdesc,'ascend');
coduri=coduri(index2);
for i=1:lp
huff(i).simbol=caracter(i);
huff(i).probabilitate=p(i);
huff(i).codul=coduri(i);
end
Calcularea Lungimii Medii:
lmed=0;
for i=1:lp
lmed=lmed+huff(i).probabilitate*length(cell2mat(huff(i).codul));
end
Calcularea Eficientei:
eficienta=entropia/lmed;
10
Calcularea Redundantei:
redundanta=((lmed-entropia)/lmed);
else
display('Eroare');
huff=[];
end
11