我有一個編碼序列的程序,即用霍夫曼方法創建碼字。編碼霍夫曼樹的算法
我需要對樹本身進行編碼,其中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
`
不幸的是,那不是霍夫曼樹。 – beaker
@beaker,哦,好吧,也許你可以改進它?我認爲沒關係,只要它能夠提供與經過驗證的霍夫曼代碼相同的平均碼字長度。 –
我不明白你怎麼可以做出這種說法,當你不僅不能生成樹,但你的代碼不起作用。你甚至沒有足夠描述你想要做什麼。 – beaker