通过在Python中遍历Huffman树返回原始文本

时间:2018-02-20 19:15:52

标签: python-3.x huffman-code

我想在我的程序中使用Huffman。我正在使用此代码here从输入文本生成代码。 我按照他们的解释使用了它,例如:

message='man the stand banana man'    
huffman.codebook(collections.Counter(message).items())

这将生成文本树并为每个字符分配代码。树显示为dict

huffTree= {'m': '0111', 'a': '10', 'n': '00', ' ': '111', 't': '1101', 'h': '0101', 'e': '0100', 's': '0110', 'd': '11001', 'b': '11000'}

我应用它来生成比特流:

bitStream = []
for ch in message:
     bitStream.append(huffTree[ch])

然后从句子生成的比特流是:011110001111101010101001110110110110001100111111000100010001011101111000

我现在想要的是如何通过在python中遍历树来返回生成的原始文本的比特流。我正在努力解决这个问题,但没有成功,这一步没有明确的解决方案。

1 个答案:

答案 0 :(得分:0)

知道霍夫曼代码是prefix code,我们可以利用它来解码你的比特流:

# Create a lookup map
lookup = { v:k for k,v in huffTree.items()}

# The decode function
def huffman_decode(msg):                   
 left = 0
 decoded = ''
 for right in range(len(msg)+1):
     token = msg[left:right]
     if token in lookup:
         decoded += lookup[token]
         left = right
 return decoded

 huffman_decode(bitStream) #'man the stand banana man'