matlab:c語言邏輯實現霍夫曼編碼。
**:
function [ h,e ] = hfmbm( p )
%p為概率分布,此函式功能是進行哈夫曼編碼
% 此處顯示詳細說明
% h為各個元素的麻子
% e為輸出的平均碼長
if length(find(p<0))~=0
error('概率不應該小於0!')
end
if abs(sum(p)-1)>10e-10
error('概率之和大於1,請檢查輸入!')
end
n=length(p);
p=sort(p)
q=p;
m=zeros(n-1,n);
for i=1:n-1
[q,e]=sort(q);
m(i,:)=[e(1:n-i+1),zeros(1,i-1)]; %由陣列l 構建乙個矩陣,該矩陣表明概率合併時的順序,用於後面的編碼
q=[q(1)+q(2),q(3:n),1];
end
for i=1:n-1
c(i,1:n*n)=blanks(n*n); %c 矩陣用於進行huffman 編碼
end c(n-1,n)='1'; %由於a 矩陣的第n-1 行的前兩個元素為進行huffman 編碼加和運算時所得的最後兩個概率(在本例中為0.02、0.08),因此其值為0 或1
c(n-1,2*n)='0';
for i=2:n-1
c(n-i,1:n-1)=c(n-i+1,n*(find(m(n-i+1,:)==1))-(n-2):n*(find(m(n-i+1,:)==1))); %矩陣c 的第n-i 的第乙個元素的n-1 的字元賦值為對應於a 矩陣中第n-i+1 行中值為1 的位置在c 矩陣中的編碼值
c(n-i,n)='0';
c(n-i,n+1:2*n-1)=c(n-i,1:n-1); %矩陣c 的第n-i 的第二個元素的n-1 的字元與第n-i 行的第乙個元素的前n-1 個符號相同,因為其根節點相同
c(n-i,2*n)='1';
for j=1:i-1
c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,n*(find(m(n-i+1,:)==j+1)-1)+1:n*find(m(n-i+1,:)==j+1));
%矩陣c 中第n-i 行第j+1 列的值等於對應於a 矩陣中第n-i+1 行中值為j+1 的前面乙個元素的位置在c 矩陣中的編碼值
endend
for i=1:n
h(i,1:n)=c(1,n*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*n); %用h表示最後的huffman 編碼
len(i)=length(find(abs(h(i,:))~=32)); %計算每乙個編碼的長度
ende=sum(p.*len); %計算平均碼長
結果:
>> [ h,e ] = hfmbm([0.1 0.1 0.02 0.08 0.35 0.35])
p = 0.0200 0.0800 0.1000 0.1000 0.3500 0.3500
h = 00100
00101
0011
00001
1e = 2.2500
少年不被樓層誤,餘生不羈盡自由。
加油,加油!
霍夫曼編碼
一 八卦 在 演算法為什麼這麼難?這篇部落格裡,劉未鵬講了乙個八卦 根據wikipedia的介紹,霍夫曼同學 當年還在讀ph.d,所以的確是 同學 而這個問題是坑爹的導師robert m.fano 給他們作為大作業的 fano自己和shannon合作給出了乙個suboptimal的編碼方案,為得不到...
霍夫曼編碼
給定乙個文字中出現的一組字元c,每個字元有其出現頻率freq,想構造字元的最優二進位制表示,即用來編碼整個文字的二進位制位最少 定長編碼 每個字元用相同長度的二進位制位數進行編碼,則每個字元的長度n必須滿足,2 n c 變長編碼 思想是賦予高頻字元短碼字,賦予低頻字元長碼字 編碼過程相對簡單,將表示...
霍夫曼編碼
霍夫曼編碼,或者也可以說哈夫曼編碼。它是一種編碼方式,是可變長編碼 vlc 的一種。準確來說,它是一種方法,什麼方法呢?這種方法,它完全依據字元出現的概率來構造異字頭的平均長度最短的碼字。哈夫曼編碼使用變成編碼表對源字元進行編碼,而這個變長編碼表是通過估算源字元出現的概率得到的。它有個特點,就是出現...