我正在编写代码,用于为给定字母表中的符号序列生成霍夫曼代码。它通过构建霍夫曼节点树的算法来实现。每个节点或者具有来自该字母表的唯一符号并且是叶节点,或者其符号设置为None
并且是父节点。所有节点都有一个代码,表示从根到它的路径。
我现在正尝试编写一个函数,通过执行以下操作对编码的符号序列进行解码:
""
x
字符 - x
是此代码的长度当前节点x
个字符x
字符这是我尝试此递归搜索的代码:
def decode(root, current, coded_sequence): # Initially called as decode(root, root, coded_sequence)
decoded_sequence = ""
for child in current.children:
if child.symbol and child.code == coded_sequence[:len(child.code)]:
decoded_sequence += child.symbol
coded_sequence = coded_sequence[len(child.code):] # Remove this matching code from the beginning of the coded sequence
decoded_sequence += decode(root, root, coded_sequence)
if child.children:
decoded_sequence += decode(root, child, coded_sequence) # Go back to the root of the tree with the new shortened coded_sequence
return decoded_sequence
我的算法有效,decoded_sequence
在开头有正确的解码序列,但后面是解码序列末尾的部分,我无法弄清楚原因。为什么我的功能会从我认为coded_sequence
现在为空时继续?
以下是示例输出:
这是我在这个例子中使用的树的最佳表示:
Root
0/ 1|
X6 None
0/ 1|
X5 None
0/ 1|
X4 None
0/ 1|
X3 None
0/ 1|
X2 X1
解
如果我改变了
,我会看起来更干净coded_sequence = coded_sequence[len(child.code):]
decoded_sequence += decode(root, root, coded_sequence)
到
decoded_sequence += decode(root, root, coded_sequence[len(child.code):])
这完全解决了这个问题,我无法理解......