簡體   English   中英

在霍夫曼編碼中如何處理?

[英]How to handle this in huffman coding?

帶有頻率的壓縮字符的輸入為

A = 1
B = 2
C = 4
D = 8
E = 16
F = 32
G = 64
H = 128
I = 256
J = 512
K = 1024
L = 2048
M = 4096
N = 8192

霍夫曼編碼算法是

首先,我們必須選擇兩個頻率最低的字符並實現一棵樹,父級作為這兩個字符頻率的總和。 之后,將0放到左側孩子,將1放到右側孩子。 然后最終選擇每個字符的值作為二進制形式,選擇它以root形式開始,然后將其放在左邊或右邊,如果放在左邊,則添加0,如果是右邊,則添加1。

它形成一棵超過8級的樹。 我們僅需提及8位二進制文​​件。 但是對於此輸入,該位越過8。在這里,我們要做的是?

如果您對所有256個可能的值進行編碼,那么某些將由8位以上的比特表示,這是正確的。 但是,您的編碼字符串不會被解釋為一個10字節的數組,而是被解釋為一系列的位,這些位可能會占用一個以上的字節,因此,霍夫曼樹的分支深度超過八個級別是可以的。

假設您有一棵霍夫曼樹,其中包含以下編碼(以及其他編碼):

E          000               # 3 bits
X          0100000001        # 10 bits
NUL        001               #3 bits

現在,當您要編碼字符串EEXEEEX ,您將獲得:

E   E   X          E   E   E   X          NUL      # original text
000 000 0100000001 000 000 000 0100000001 001      # encoded bits

現在,您將這一系列位組織為8個塊,即字節:

eeeEEExx    xxxxxxxx    EEEeeeEE    Exxxxxxx    xxxNNN      # orig

00000001    00000001    00000000    00100000    00100100    # bits
enc[0]      enc[1]      enc[2]      enc[3]      enc[4]      # bytes

(四個子塊只是為了易於閱讀。最后兩個零位是填充。)字節數組enc現在是您的編碼字符串。

壓縮來自經常使用的字符占用少於一個字節的事實。 例如,前兩個E適合單個字節。 這里很少使用的字符(例如X)具有更長的編碼,甚至可能跨越幾個字節。

當然,您必須從當前字節中提取當前位,以便遍歷霍夫曼樹。 您將需要按位運算符。

暫無
暫無

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

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