簡體   English   中英

用C ++緊湊地保存霍夫曼樹

[英]Saving a Huffman Tree compactly in C++

假設我已經用壓縮文件對霍夫曼樹進行了編碼。 因此,我有一個示例文件輸出:

001A1C01E01B1D

我在將此字符串逐位保存到文件時遇到問題。 我知道C ++一次只能輸出到一個字節的文件,所以在將這個字符串存儲為字節時遇到了問題。 是否可以將前三位轉換為一個char而不將程序填充到一個字節? 如果它為遍歷代碼填充一個字節,那么我的樹(和代碼)將被完全弄亂。 如果我一次將其切成一個字節,那么如果樹不是8的倍數又會怎樣呢? 如果壓縮文件的位長不是8的整數倍,會發生什么?

希望我已經足夠清楚了。

只需將n個字節的序列視為8n位的序列即可。 使用>><<| &運算符從可變長度位代碼的序列中組合字節。

流的末尾對於正確處理很重要。 您需要流碼的結尾,以便解碼器知道停止而不是嘗試對完成最后一個字節的最終填充位進行解碼。

解決此問題的標准方法是填充。 有許多可能的填充方案。 填充方案最多填充偶數個字節(即8位的倍數)。 另外,它們對消息的長度進行編碼(以位為單位),或者對填充位的數量進行編碼(從中可以通過減法確定以位為單位的消息長度)。 后一種解決方案顯然會導致填充效率更高。

最簡單的是,您可以在最后一個字節中附加“未使用”的位數作為附加字節值。

從上一層開始,假設填充位的數量適合3位。 定義編碼文件的最后3位以對填充位的數量進行編碼。 現在,如果消息占用的最后一個字節不超過5位,則填充可以很好地適合同一字節。 如果需要添加一個字節來包含填充,則最大間隙為5 + 2 = 7(5來自額外字節的未使用高位,而2是最后一個字節中的最大可用空間,否則為3 -bit填充值就適合在那里)。 由於0-7可以用3位表示,因此可以工作(對於2位無效,因為最大間隙較大並且可表示值的范圍較小)。

順便說一句,將填充信息放置在文件末尾(而不是作為文件頭放在文件頭)的主要優點之一是,壓縮函數可以隨后對流進行操作而不必知道其長度提前。 通過仔細處理EOF信號,解壓縮也可以基於流。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM