繁体   English   中英

霍夫曼以比特存储代码

[英]Huffman storing code in bits

我已经建造了霍夫曼树。 但由于我不知道如何,我不知道将代码存储到位

处理可变长度。

我想创建一个表,用于存储比特的霍夫曼代码以打印编码结果。

我不能像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位。

Thx提前。

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

存储一下:

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

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

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

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

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

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

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发布的算法。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM