function
[ u, c, e, f] = huff_codec
( a )
%huff_codec 哈夫曼編碼的matlab實現
% author==frank
% 本程式重點在建樹和建表過程,以及求解平均碼長和編碼效率
% 因為建表的順序不一致,可能會導致碼表不一致,但是都滿足熵編碼要求
%u 輸出排序後的頻率分布
%c 輸出碼表
%e 輸出平均碼長
%f 輸出編碼效率 平均碼長/熵
%a 輸入的原始頻率分布,為行向量eg a=[1,2,3,4,5]
a=sort(a,'descend');%按降序排列
t=a;u=a;
a=a/sum(a);
[~,n]=size(a);
%生成待編碼矩陣,每列最後乙個元素為特殊元素的位置
b=zeros(n,n);
fori=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;
forj=2:n%生成編碼表的其他各列
fori=1:t
b(i,j)=t(i);
endif 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;
endend%生成huffman碼字矩陣和排序後元素的碼表向量
m=3;s1=sym('[2,1]');s2=s1;%碼表,用1表示0,2表示1,因為0會因為被省略導致無法記錄
%這裡意思是從倒數第三列開始建表,因為最後一列和倒數第二列的情況我們可以直接推出。
fori=n-2:-1:1
p=b(n,i+1);%p是每列儲存的特殊元素的位置,特殊元素指的是由上一列最後兩個數新合成的數
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);
ends2(m-1)=[char(s1(p)),'2'];
s2(m)=[char(s1(p)),'1'];
m=m+1;
s1=s2;
endl=zeros(1,n);
fori=1:n
[~,r]=size(char(s2(i)));
l(i)=r;
end%將碼表轉換成0和1輸出
arr=zeros(1,n);
arr(1:n)=s2(1:n);
str=;
fori=1:n
s=num2str(arr(i));
s=strrep(s,'1','0');
s=strrep(s,'2','1');
ifi==1
str=s;
else
str=[str,' ',s];
endend 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編碼 huffman編碼的MATLAB遞迴實現
huffman.m huffman編碼的遞迴實現。輸入 input 第一列為值,第二列為各個值的概率。codein,輸入即可,沒用,作遞迴時用到。輸出 output 排序後的input。code 對應p每行的huffman編碼。key 沒用,設為 即可,作遞迴時用到。參看測試 huffmantest...
Huffman編碼的實現
這裡的huffman編碼就是離散數學中學的最優二叉樹,現在我們用c 來實現它。首先考慮實現它使用的資料結構,當然這裡肯定使用二叉樹。其次就是儲存方式,對於樹一般情況是用間接儲存也就是鍊錶。但是二叉鍊錶不方便尋找雙親節點,這裡使用向量更好,對儲存空間的利用率也較高。建立資料結構 huffman樹中每個...
Huffman樹的實現
huffmantree.h inte ce for the huffmantree class.if defined afx huffmantree h e2fe6c12 c0a9 4483 af1b 9623f1fd0ef8 included define afx huffmantree h e2...