利用matlab自帶函數對字符串進行Huffman編碼

1. 代碼

clear; clc;

str = 'You have to believe in yourself. That is the secret of success.';

%根據字符串str得到符號集symbols,並計算各集合元素的出現概率數組p
len = length(str);
unique_str = unique(str);
unique_len = length(unique_str);

symbols = cell(1, unique_len);
p = zeros(1, unique_len);

for i = 1:unique_len
    symbols{1,i} = unique_str(i);
    p(i) = numel(find(str==unique_str(i))) / len;
end

%根據符號集symbols和概率數組p計算Huffman編碼詞典
[dict, avglen] = huffmandict(symbols, p);

%計算平均碼長
code_len = zeros(unique_len, 1);
for i = 1:unique_len
    code_len(i) = numel(cell2mat(dict(i,2)));
end
max_len = max(code_len);

%打印字典表
for i = 1:unique_len
    fprintf('`%s` : ', unique_str(i));
    fprintf('%d ', dict{i,2});
    fprintf('\n');
end

fprintf('平均碼長 : %f\n', sum(p*code_len) );
fprintf('信源熵 : %f\n', sum(p.*(-log2(p))) );
fprintf('編碼效率 : %f\n', 1/sum(p.*(-log2(p))) );

%計算字符串最終編碼長度
enc_len = 0;
for i = 1:len
    enc_len = enc_len + numel(dict{unique_str==str(i),2});
end
fprintf('編碼前字符串總長度 : %d\n', numel(str));
fprintf('編碼後字符串二進制總長度 : %d\n', enc_len);
fprintf('編碼後字符串字節總長度(%d/8) : %d\n', enc_len, ceil(enc_len/8));

%打印最終編碼
fprintf('編碼結果 : ');
for i = 1:len
    %fprintf('%s : ', str(i));
    fprintf('%d', dict{unique_str==str(i),2});
    fprintf(' ');
end
fprintf('\n');

2. 輸出結果

` ` : 0 0 0 
`.` : 1 0 0 1 0 
`T` : 1 0 0 1 1 1 
`Y` : 1 0 0 1 1 0 
`a` : 0 1 1 0 1 
`b` : 0 1 0 0 0 0 1 
`c` : 1 1 0 1 
`e` : 0 0 1 
`f` : 0 1 1 0 0 
`h` : 1 1 0 0 
`i` : 1 1 1 1 
`l` : 0 1 1 1 1 
`n` : 0 1 0 0 0 0 0 
`o` : 1 0 0 0 
`r` : 0 1 1 1 0 
`s` : 1 0 1 
`t` : 0 1 0 1 
`u` : 1 1 1 0 
`v` : 0 1 0 0 1 
`y` : 0 1 0 0 0 1 
平均碼長 : 3.968254
信源熵 : 3.927877
編碼效率 : 0.254590
編碼前字符串總長度 : 63
編碼後字符串二進制總長度 : 250
編碼後字符串字節總長度(250/8) : 32
編碼結果 : 100110 1000 1110 000 1100 01101 01001 001 000 0101 1000 000 0100001 001 01111 1111 001 01001 001 000 1111 0100000 000 010001 1000 1110 01110 101 001 01111 01100 10010 000 100111 1100 01101 0101 000 1111 101 000 0101 1100 001 000 101 001 1101 01110 001 0101 000 1000 01100 000 101 1110 1101 1101 001 101 101 10010 

3. 討論

  Huffman編碼存在不唯一的問題。舉個例子,對於字符串google進行Huffman編碼可以是如下:

這裏寫圖片描述

  隨意翻到有篇論文中探討了這個問題,提出增加三條約束來使得Huffman編碼唯一化:
  1)儘量減少Huffman樹的層次數
  2)層次多的放在右分支
  3)先出現的現用於構造

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章