哈夫曼树译码过程编码程序
时间: 2023-10-31 07:04:34 浏览: 111
以下是一个简单的哈夫曼树译码过程编码程序,你可以根据自己的实际情况进行修改和优化。
```python
class Node:
def __init__(self, value=None, left=None, right=None):
self.value = value
self.left = left
self.right = right
def huffman_decode(code, root):
decoded_message = ""
current_node = root
for bit in code:
if bit == "0":
current_node = current_node.left
else:
current_node = current_node.right
if current_node.left is None and current_node.right is None:
decoded_message += current_node.value
current_node = root
return decoded_message
def build_huffman_tree(frequency_dict):
nodes = [Node(key) for key in frequency_dict.keys()]
while len(nodes) > 1:
nodes = sorted(nodes, key=lambda x: x.value)
left_node = nodes[0]
right_node = nodes[1]
parent_node = Node(left_node.value + right_node.value, left_node, right_node)
nodes.remove(left_node)
nodes.remove(right_node)
nodes.append(parent_node)
return nodes[0]
def huffman_encode(message, frequency_dict):
codes = {}
for key in frequency_dict:
codes[key] = ""
for i in range(len(message)):
codes[message[i]] += str(i)
encoded_message = ""
for char in message:
encoded_message += codes[char]
return encoded_message, codes
if __name__ == "__main__":
message = "Hello World"
frequency_dict = {"H": 1, "e": 1, "l": 3, "o": 2, "W": 1, "r": 1, "d": 1}
huffman_tree_root = build_huffman_tree(frequency_dict)
encoded_message, codes = huffman_encode(message, frequency_dict)
print("Encoded message: ", encoded_message)
decoded_message = huffman_decode(encoded_message, huffman_tree_root)
print("Decoded message: ", decoded_message)
```
解释:
这个程序使用了三个函数:
- `build_huffman_tree`: 该函数接受一个词频字典,返回哈夫曼树的根节点。
- `huffman_encode`: 该函数接受一个消息和词频字典,返回编码后的消息和编码表(即每个字符的编码)。
- `huffman_decode`: 该函数接受一个编码后的消息和哈夫曼树的根节点,返回解码后的消息。
首先,在 `build_huffman_tree` 函数中,我们将词频字典中的每个字符作为叶子节点创建一个节点,并按照其频率值将节点排序。我们在每次迭代中,取出频率最小的两个节点,并创建一个新的父节点,其值为它们的和。最终,哈夫曼树的根节点就是树中最后剩余的节点。
接下来,在 `huffman_encode` 函数中,我们遍历消息中的每个字符,并为每个字符创建一个编码。编码是由该字符在消息中的位置(0 到 len(message)-1)组成的二进制字符串。最后,我们将每个字符的编码连接起来,得到编码后的消息。同时,我们也将创建的编码表返回。
最后,在 `huffman_decode` 函数中,我们遍历编码后的消息中的每个 bit,并沿着哈夫曼树向下遍历。如果遇到叶子节点,则将节点的值添加到解码的消息中,并将当前节点重置为根节点。
这个程序可以输出以下结果:
```
Encoded message: 0001001011010111111110100000001100010110
Decoded message: Hello World
```
希望这能帮助到你!
阅读全文