我有一个编码序列的程序,即使用霍夫曼方法创建代码字。
我需要对树本身进行编码,其中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
`
答案 0 :(得分:0)
通常,您只需编码每个符号的代码字长度。例如,如果你构建了树,那么你就得到了
A -> 10
B -> 0
C -> 111
D -> 110
你只需写出[2,1,3,3]
之类的长度数组当然,有很多树会产生相同的代码长度,但使用哪一种并不重要,因为它们都同样有效。
发送方和接收方必须使用相同的树,因此在写出长度之后,发送方从长度中构建一个新树,其方式与接收方完全相同,例如,
A -> 00
B -> 1
C -> 010
D -> 011
只要发送方和接收方构建相同的树,一切正常,并且您已避免传输所有可将一个等效树与另一个树区分开的冗余信息。