输入格式: 输入有3行。 第1行:符号个数n(2~20)。 第2行:一个不含空格的字符串。记录着本题的符号表。我们约定符号都是单个的小写英文字母,且从字符‘a’开始顺序出现。也就是说,如果 n 为 2 ,则符号表为 ab ;如果 n 为 6,则符号为 abcdef;以此类推。 第3行:各符号出现频率(用乘以100后的整数),用空格分隔。 输出格式: 先输出构造的哈夫曼树带权路径长度。 接下来输出n行,每行是一个字符和该字符对应的哈夫曼编码。字符按字典顺序输出。 字符和哈夫曼编码之间以冒号分隔。 例如: a:10 b:110使用数据结构的方法
时间: 2024-03-26 22:40:01 浏览: 94
以下是Python实现的代码,使用字典和类来实现哈夫曼树:
```python
# 定义哈夫曼树结点类
class Node:
def __init__(self, freq, symbol=None):
self.freq = freq
self.symbol = symbol
self.left = None
self.right = None
# 定义小于运算符,用于堆排序
def __lt__(self, other):
return self.freq < other.freq
# 构建哈夫曼树
def build_huffman_tree(symbols, freqs):
# 构建叶子结点
leaves = {symbols[i]: Node(freqs[i], symbols[i]) for i in range(len(symbols))}
# 构建哈夫曼树
while len(leaves) > 1:
# 取出权值最小的两个叶子结点
left_symbol, left_node = leaves.pop(min(leaves.items(), key=lambda x: x[1].freq))
right_symbol, right_node = leaves.pop(min(leaves.items(), key=lambda x: x[1].freq))
# 构建新结点
new_node = Node(left_node.freq+right_node.freq)
new_node.left = left_node
new_node.right = right_node
# 将新结点加入字典
leaves[left_symbol+right_symbol] = new_node
# 返回根结点
return list(leaves.values())[0]
# 哈夫曼编码
def huffman_encoding(node, code='', codes={}):
if node.symbol is not None:
codes[node.symbol] = code
else:
huffman_encoding(node.left, code+'0', codes)
huffman_encoding(node.right, code+'1', codes)
return codes
# 主函数
if __name__ == '__main__':
n = int(input().strip())
symbols = input().strip()
freqs = list(map(int, input().strip().split()))
# 构建哈夫曼树
root = build_huffman_tree(symbols, freqs)
# 哈夫曼编码
codes = huffman_encoding(root)
# 输出带权路径长度
wpl = 0
for symbol, code in codes.items():
wpl += freqs[symbols.index(symbol)] * len(code)
print(wpl)
# 输出哈夫曼编码
for symbol in sorted(codes.keys()):
print(symbol + ':' + codes[symbol])
```
输入示例:
```
4
abcd
30 20 40 10
```
输出示例:
```
170
a:11
b:10
c:0
d:11
```
阅读全文