给定Matlab中的向量V我想计算代码长度而不生成代码......
v = [0.1,0.1,0.1,0.2,0.2,0.3]; 代码长度= 17。 如何在不生成代码的情况下计算它。
由于
答案 0 :(得分:1)
所以有六个符号?那么最大码长度不能是17.对于任何频率组,具有六个符号的最大码长是5比特。 (0,10,110,1110,11110,11111)。
对于该特定概率集,假设每个概率一个符号并且概率是精确的,根据执行霍夫曼算法时所做的选择,您可以得到两个不同的代码。一个的最大长度为3,另一个的最大长度为4.两个代码在编码符号时同样最佳。这两个代码的代码长度按照相同的频率顺序排列(4,4,3,2,2,2)和(3,3,3,3,2,2)。
您可以指六个可能符号上的位总和,其中一个代码实际上是17,而另一个代码是16。然而,这是一种毫无意义的衡量标准,因为你曾经使用过一次符号,这与它们陈述的概率相矛盾。一种有用的措施是将每个符号长度乘以比特乘以得到平均符号长度的概率。对于这两个代码,这是2.5位。这就是验证两个代码是否同样最佳的方法。
通常,您需要应用Huffman算法以确定最大代码长度。没有其他捷径。您可以遍历树以查找最大长度。您不需要显式生成代码本身,但代码由树隐含。
您可以计算熵以获得平均符号长度的下限(以位为单位)。这是每个概率乘以其负基数-2对数的总和。在这种情况下,熵是2.446。
答案 1 :(得分:0)
也许我不清楚我的问题,但我认为这段代码将返回数据'v'向量的最小代码长度。
% return the huffman lenght of a matrix
function S = hufman_length(v)
v = (v(:));
v = hist(v,256);
v = v(find(v>0));
S = 0;
%acumulating the probability
while (length(v) >= 2)
v = sort(v);
S = S + v(1) + v(2);
v(2) = v(1) + v(2);
v = v(2:length(v));
end
end