簡體   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