【问题描述】使用贪心算法求解Huffman编码问题,具体来说就是,根据每个字符的出现频率,使用最小堆构造最小优先队列,构造出字符的最优二进制表示,即前缀码。
【输入形式】在屏幕上输入字符个数和每个字符的频率。
【输出形式】每个字符的Huffman编码。
【样例输入】
6
45 13 12 16 9 5
【样例输出】
a 0
b 101
c 100
d 111
e 1101
f 1100
【样例说明】
输入:字符个数为6,a至f每个字符的频率分别为:45, 13, 12, 16, 9, 5。
输出:每个字符对应的Huffman编码。
【评分标准】根据输入得到准确的输出。
import numpy as np
import heapq
import queue
class Node:
def __init__(self, freq=None, char=None, left=None, right=None, code=None): #初始化
self.freq = freq
self.char = char
self.left = left
self.right = right
self.code = code
def __lt__(self, other): # 重载<号
return self.freq < other.freq
class Heap:
def __init__(self): # 初始化
self._queue = []
def push(self, priority, item): # 堆输入
heapq.heappush(self._queue, (priority, item))
def pop(self): # 堆输出
if self._queue:
return heapq.heappop(self._queue)[-1]
else:
return None
def traceback(root, code):
if root is None:
return
root.code = code
traceback(root.left, code + "0")
traceback(root.right, code + "1")
def print_res(root, b): # 遍历
q = queue.Queue() # 队列初始化
q.put(root) # 队列输入
while not q.empty():
node = q.get() # 队列输出
if node.char:
# print(node.char, node.code)
b[ord(node.char)-97] = node.code
# print(a[node.char-ord(a)])
# a.update({node.char, node.code})
if node.left:
q.put(node.left)
if node.right:
q.put(node.right)
def huffman(C):
n = len(C)
Q = Heap()
for i in range(n):
Q.push(C[i], Node(C[i], chr(97 + i)))
for i in range(n - 1):
x = Q.pop()
y = Q.pop()
z = Node(x.freq + y.freq, None, x, y, None)
Q.push(z.freq, z)
return Q.pop()
def main():
n = int(input())
b = [0]*n
C = list(map(int, input().split()))
root = huffman(C)
traceback(root, "")
print_res(root, b)
for i in range(n):
print(chr(97 + i),b[i])
if __name__ == '__main__':
main()