输入格式: 输入有3行。 第1行:符号个数n(2~20)。 第2行:一个不含空格的字符串。记录着本题的符号表。我们约定符号都是单个的小写英文字母,且从字符‘a’开始顺序出现。也就是说,如果 n 为 2 ,则符号表为 ab ;如果 n 为 6,则符号为 abcdef;以此类推。 第3行:各符号出现频率(用乘以100后的整数),用空格分隔。 输出格式: 先输出构造的哈夫曼树带权路径长度。 接下来输出n行,每行是一个字符和该字符对应的哈夫曼编码。字符按字典顺序输出。 字符和哈夫曼编码之间以冒号分隔。 例如: a:10 b:110
时间: 2024-03-26 11:39:58 浏览: 96
以下是Python实现的代码:
```python
import heapq
# 定义哈夫曼树结点类
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):
# 将结点放入小根堆中
heap = [Node(freqs[i], symbols[i]) for i in range(len(symbols))]
heapq.heapify(heap)
# 依次取出堆中两个最小的结点,合并成一个新结点,重新放入堆中
while len(heap) > 1:
node1 = heapq.heappop(heap)
node2 = heapq.heappop(heap)
new_node = Node(node1.freq + node2.freq)
new_node.left = node1
new_node.right = node2
heapq.heappush(heap, new_node)
# 返回根结点
return heap[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
```
阅读全文