使用bitarray
模塊你霍夫曼恩/解編碼免費,可能比什麼都更有效率:
from bitarray import bitarray
huffman_dict = {
'!': bitarray('01110'), 'B': bitarray('01111'),
'l': bitarray('10100'), 'q': bitarray('10110'),
'y': bitarray('10111')
}
a = bitarray()
a.encode(huffman_dict, 'Bylly!')
print(a)
dec = bitarray('011111011101110').decode(huffman_dict)
print(dec)
print(''.join(dec))
# # output:
# bitarray('011111011110100101001011101110')
# ['B', 'y', '!']
# By!
,如果你不想安裝模塊,請閱讀下面的部分。
這裏是使用哈夫曼樹解碼一個變種 - 該程序作品,但有可能是更好的變種來表示二進制樹(我選擇了一個元組)。
這個版本可能更適合當你的代碼字長度不一樣時。關於二叉樹的另一個好處是,這裏顯然代碼是無前綴的。
您在樹形式的代碼如下所示(爲了使樹構造可見過度縮進):使用可以再解碼
huffman_tree = \
( # 0
( # 00
None,
# 01
( # 010
None,
# 011
( # 0110
None,
# 0111
( # 01110
'!',
# 01111
'B')))),
# 1
( # 10
( # 100
None,
# 101
( # 1010
( # 10100
'l',
# 10101
None
),
# 1011
( # 10110
'q',
# 10111
'y'))),
# 11
None))
有:
def huffman_decode(strg):
ret = ''
cur_node = huffman_tree
for char in strg:
cur_node = cur_node[int(char)]
if cur_node is None:
raise ValueError
elif isinstance(cur_node, str):
ret += cur_node
cur_node = huffman_tree
return ret
print(huffman_decode('011111011101110'))
如果解碼命中None
發生了一些錯誤,並且引發了ValueError
。只要解碼遇到一個字符串,當前節點cur_node
被重置爲「根節點」,並且遊戲從樹的開始處開始。
只是因爲我可以:這裏是你的(不完整)huffman樹的視覺顯示(這可能有助於理解算法的作用:無論何時遇到0
:向右+向下;每當遇到1
:go右+向上);如果您擊中了一個結束節點:返回該節點處的字符並在根節點處重新啓動。
然後顯示您的解碼代碼。手動:'011111011101110' - >'01111' = B,'10111' = y和'01110' =!,根據您自己的表格正確。 – usr2564301