課程學習 霍夫曼編碼

2021-09-20 07:24:55 字數 1715 閱讀 9200

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 的一種。準確來說,它是一種方法,什麼方法呢?這種方法,它完全依據字元出現的概率來構造異字頭的平均長度最短的碼字。哈夫曼編碼使用變成編碼表對源字元進行編碼,而這個變長編碼表是通過估算源字元出現的概率得到的。它有個特點,就是出現...