哈夫曼编码(贪心算法)

【问题描述】使用贪心算法求解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()


你可能感兴趣的:(python,算法分析与设计,优先队列,贪心算法,算法,python)