霍夫曼以比特存储代码

时间:2012-12-10 23:52:42

标签: c++

我已经建造了霍夫曼树。但由于我不知道如何

,我不知道将代码存储到位

处理变量长度。

我想创建一个表,用于将huffman代码存储为位以打印编码结果。

我不能像bitset一样使用STL包含。

我尝试过那样的

   void traverse( string code = "")const
   {
        if( frequency == 0 ) return;
        if ( left ) {
             left->traverse( code + '0' );
             right->traverse( code + '1' );
        }
        else {//leaf node
             huffmanTable[ch] = code;
        }
   } 

你能给我一些处理它的算法吗?

我想存储'0'使用1位而“1”使用1位。

提前谢谢。

3 个答案:

答案 0 :(得分:2)

你需要一个缓冲区,一个以字节为单位跟踪缓冲区大小的变量,以及一个跟踪缓冲区中有效位数的变量。

存储一下:

  1. 检查添加位是否会增加存储的字节数。如果没有,请跳至步骤4.

  2. 缓冲区中是否有空间存储额外的字节?如果是,请跳至步骤4.

  3. 重新分配几个字节的存储缓冲区。复制现有数据。增加保持缓冲区大小的变量。

  4. 计算将存储下一位的字节位置和位位置。根据需要设置或清除该位。

  5. 增加保存存储位数的变量。

答案 1 :(得分:1)

您可以使用固定大小的结构来存储表,只使用位来存储编码输入:

struct TableEntry {
  uint8_t size;
  uint8_t code;
};

TableEntry huffmanTable[256];

void traverse(uint8_t size; uint8_t code) const {
        if( frequency == 0 ) return;
        if ( left ) {
             left->traverse(size+1, code << 1 );
             right->traverse(size+1, (code << 1) | 1 );
        }
        else {//leaf node
             huffmanTable[ch].code = code;
             huffmanTable[ch].size = size;
        }
} 

对于编码,您可以使用David发布的算法。

答案 2 :(得分:1)

基本上我会根据树的最大密钥长度/深度使用两种不同的方法之一:

  • 如果你有一个固定的长度并且它比可用的整数数据类型(如long int)短,你可以使用perreal显示的方法。

  • 如果您不知道最大深度并认为可能空间不足,我会使用std::vector<bool>作为代码值。这是使用每个值一位的向量的特殊实现(基本上是David的方法)。