[英]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.