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