Algorithm 哈夫曼树的编码算法

Algorithm 哈夫曼树的编码算法,algorithm,matlab,huffman-code,Algorithm,Matlab,Huffman Code,我有一个编码序列的程序,即使用哈夫曼方法创建码字 我需要对树本身进行编码,其中node=0,leaf=1。我猜它应该类似于一个二进制堆,其中第一个元素(0)表示它有两个子元素,接下来的两个元素(例如,00)也各有两个子元素,接下来的四个元素(10 00)-有一个叶子和三个非叶子子元素,依此类推 对于给定的序列,我有一个结果,但我不知道如何得到它 function [ ] = encodeTwoPassHuff( ) global CODE global codeTree codeTree=[

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

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

对于给定的序列,我有一个结果,但我不知道如何得到它

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

`通常,您只需对每个符号的码字长度进行编码。例如,如果你建了一棵树

A -> 10
B -> 0
C -> 111
D -> 110
您只需写出长度数组,如[2,1,3,3]

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

但是,发送方和接收方必须使用同一棵树,因此在写出长度后,发送方根据长度以接收方完全相同的方式构建一棵新树,例如

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

只要发送者和接收者构建同一棵树,一切都会正常工作,您就避免了传输所有冗余信息,这些冗余信息会将一棵等效树与另一棵等效树区分开来。

这是合理的,我明白了,但我还是想按照我描述的方式对树进行编码不幸的是,这不是哈夫曼树。@Biker,哦,好吧,也许你能改进一下?我认为只要它给出与已验证的哈夫曼代码相同的平均码字长度就可以了。我不明白当你不仅不能生成树,而且你的代码也不能工作时,你怎么能做出这样的声明。你甚至没有充分描述你要做什么。