[英]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提前。
您需要一个缓冲区,一个用于跟踪缓冲区大小的变量(以字节为单位),以及一个用于跟踪缓冲区中有效位数的变量。
存储一下:
检查添加一个位是否会增加存储的字节数。 如果没有,请跳至步骤4。
缓冲区中是否有空间存储额外的字节? 如果是,请跳至步骤4。
重新分配几个字节的存储缓冲区。 复制现有数据。 增加保持缓冲区大小的变量。
计算将存储下一位的字节位置和位位置。 根据需要设置或清除该位。
增加保存存储位数的变量。
您可以使用固定大小的结构来存储表,只使用位来存储编码输入:
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.