代码
function [ u, c, e, f] = huff_codec( A )
A=sort(A,'descend');
T=A;u=A;
A=A/sum(A);
[~,n]=size(A);
B=zeros(n,n);
for i=1:n
B(i,1)=T(i);
end
r=B(i,1)+B(i-1,1);
T(n-1)=r;T(n)=0;
T=sort(T,'descend');
t=n-1;
for j=2:n
for i=1:t
B(i,j)=T(i);
end
if t>1
K=find(T==r);
B(n,j)=K(end);
r=(B(t-1,j)+B(t,j));
T(t-1)=r;
T(t)=0;
T=sort(T,'descend');
t=t-1;
else
B(n,j)=1;
end
end
m=3;s1=sym('[2,1]');s2=s1;
for i=n-2:-1:1
p=B(n,i+1);
if p==1
s2(1:m-2)=s1(2:m-1);
elseif p==m
s2(1:m-2)=s1(1:m-2);
elseif p==2
s2(1)=s1(1);
s2(2:m-2)=s1(3:m-1);
else
s2(1:p-1)=s1(1:p-1);
s2(p+1:m-2)=s1(p+1:m-2);
end
s2(m-1)=[char(s1(p)),'2'];
s2(m)=[char(s1(p)),'1'];
m=m+1;
s1=s2;
end
L=zeros(1,n);
for i=1:n
[~,r]=size(char(s2(i)));
L(i)=r;
end
arr=zeros(1,n);
arr(1:n)=s2(1:n);
str=[];
for i=1:n
s=num2str(arr(i));
s=strrep(s,'1','0');
s=strrep(s,'2','1');
if i==1
str=s;
else
str=[str,' ',s];
end
end
str=regexp(str,' ','split');
c=str;
e=sum(L.*A);
H1=log2(A);
H=-A*(H1');
f=H/e;
end
使用示例
>>p=[1,2,3,4,5,6,7]
>>[ u, c, e, f] = huff_codec( p )
参考
matlab实现huffman编码