编码霍夫曼树的算法

时间:2017-04-30 18:07:37

标签: algorithm matlab huffman-code

我有一个编码序列的程序,即使用霍夫曼方法创建代码字。

我需要对树本身进行编码,其中node = 0,leaf = 1。它应该像二进制堆我猜,其中第一个元素(0)表示它有2个子元素,接下来的两个元素(例如,00)也各有两个子元素,接下来的四个(10 00) - 有一个叶子和3个非叶儿等等

我有给定序列的结果,但我不知道如何得到它。

function [  ] = encodeTwoPassHuff(  )
global CODE
global codeTree
codeTree=[];
clc;

inputStr='IF_WE_CANNOT_DO_AS_WE_WOULD_WE_SHOULD_DO_AS_WE_CAN';
a=unique(inputStr);
N=size(inputStr,2);
Nx = zeros(1, size(a, 2));
for i = 1:size(a,2)
     for j = 1:N        
        if (a(i) == inputStr(j))
             Nx(i) = Nx(i)+1;
        end
     end
end
for i = 1 : size(a, 2)
    prob(i) = Nx(i) / N;
end


CODE = cell( length(prob), 1 );


p=prob;
s = cell( length(p), 1 );
for i = 1:length(p)
    s{i} = i;   
end

while size(s, 1) > 2
    [p,i] = sort(p, 'ascend');
    p(2) = p(1) + p(2);
    p(1) = [];
    s = s(i);           
    s{2} = {s{1},s{2}}; 
    s(1) = [];          
end


CODE = makecode(s, []);    


fprintf('00010000010100110111101101111\n'); % encoded tree (true)
fprintf('%d', codeTree); % my result
fprintf('\n');

for i = 1:length(CODE)
    len(i) = length(CODE{i});
end

% print
disp('symbol | probabil | len | codeword');
for i=1:length(prob)
        fprintf('%5s\t %.4f\t %3d\t %s\n', a(i), prob(i), len(i), num2str(CODE{i}));
end

end 


function [CODE]=makecode(ss, codeword)
global CODE
global codeTree

if isa(ss,'cell')   % node
    codeTree = [codeTree 0];
    makecode( ss{1}, [codeword 1] );
    makecode( ss{2}, [codeword 0] );

else                % leaf
    CODE{ss} = char('0' + codeword);
    codeTree = [codeTree 1];
end
end

`

1 个答案:

答案 0 :(得分:0)

通常,您只需编码每个符号的代码字长度。例如,如果你构建了树,那么你就得到了

A -> 10
B -> 0
C -> 111
D -> 110

你只需写出[2,1,3,3]

之类的长度数组

当然,有很多树会产生相同的代码长度,但使用哪一种并不重要,因为它们都同样有效。

发送方和接收方必须使用相同的树,因此在写出长度之后,发送方从长度中构建一个新树,其方式与接收方完全相同,例如,

A -> 00
B -> 1
C -> 010
D -> 011

只要发送方和接收方构建相同的树,一切正常,并且您已避免传输所有可将一个等效树与另一个树区分开的冗余信息。