【问题标题】:How to calculate Huffman code length without generating the actual huffman code如何在不生成实际霍夫曼代码的情况下计算霍夫曼代码长度
【发布时间】:2015-06-12 17:35:01
【问题描述】:

在 Matlab 中给定一个向量 V 我想在不生成代码的情况下计算代码长度...

v = [0.1,0.1,0.1,0.2,0.2,0.3]; 代码长度 = 17。 如何在不生成代码的情况下计算它。

谢谢

【问题讨论】:

  • 什么是“代码长度”?你的意思是产生最大长度的符号的长度吗?
  • 向量生成的代码长度如上图所示。 v 生成的代码长度为 17 位。不生成huffman码我能知道v生成码的长度吗?
  • 它是所有符号的总和
  • 如果不实际构建所有符号的概率质量函数,然后递归地确定每个符号的代码,我认为这是不可能的。这是一种基于 PMF 计算符号的动态算法。仅考虑您的数据,我看不到您所要求的封闭形式的解决方案。相反,我要问你另一个问题:为什么你有必要这样做?为什么不想构建霍夫曼表?

标签: matlab vector huffman-code


【解决方案1】:

所以有六个符号?那么最大代码长度不能是 17。对于 any 组频率的六个符号的最大代码长度是 5 位。 (0、10、110、1110、11110、11111)。

对于特定的一组概率,假设每个概率有一个符号并且概率是准确的,根据执行 Huffman 算法时所做的选择,您可以获得两种不同的代码。一种最大长度为 3,另一种最大长度为 4。两种代码在编码符号方面同样最佳。这两个代码的代码长度相同,频率顺序相同,分别为 (4,4,3,2,2,2) 和 (3,3,3,3,2,2)。

您可能指的是六个可能符号上的位总和,实际上其中一个代码为 17,而另一个代码为 16。然而,这是一个毫无意义的衡量标准,因为您已经使用了每个符号一次,这与它们声明的概率相矛盾。一个有用的测量方法是将每个符号长度(以比特为单位)乘以概率,以获得以比特为单位的平均符号长度。这两个代码都是 2.5 位。这就是您验证两个代码是否同样最优的方式。

一般来说,您需要应用 Huffman 算法来确定最大代码长度。没有其他捷径。您可以遍历树以找到最大长度。您不需要显式生成代码本身,但代码是由树隐含的。

您可以计算熵以获得平均符号长度(以位为单位)的下限。这是每个概率的总和乘以它的以 2 为底的负对数。在这种情况下,熵是 2.446。

【讨论】:

  • 100% 同意。 +1。我试着问 OP 为什么他们甚至想回答这个问题......还没有回复。
【解决方案2】:

也许我的问题并不清楚,但我认为这段代码将返回数据向量“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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    相关资源
    最近更新 更多