我已经建造了霍夫曼树。但由于我不知道如何
,我不知道将代码存储到位处理变量长度。
我想创建一个表,用于将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位。
提前谢谢。答案 0 :(得分:2)
你需要一个缓冲区,一个以字节为单位跟踪缓冲区大小的变量,以及一个跟踪缓冲区中有效位数的变量。
存储一下:
检查添加位是否会增加存储的字节数。如果没有,请跳至步骤4.
缓冲区中是否有空间存储额外的字节?如果是,请跳至步骤4.
重新分配几个字节的存储缓冲区。复制现有数据。增加保持缓冲区大小的变量。
计算将存储下一位的字节位置和位位置。根据需要设置或清除该位。
增加保存存储位数的变量。
答案 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的方法)。