Python实现Huffman Code

class Node:
    def __init__(self, weight):
        self.weight = weight
        self.parent = -1
        self.charCode = -1
        self.tag = 0
def Huffman(consequent):
    """
    This function creates HuffmanCode
    The left branch is 1 and the right branch is 0
    That's meaning the small value is at left, and the big value is at right.
    :param consequent: Needing to encode list
    :return:Encoding code list
    """

    consequentLength = len(consequent)

    # first step: count unique element times
    elementDict = dict()
    for se in consequent:
        elementDict[se] = elementDict.get(se, 0) + 1

    # second step: calculate the probability of element
    frequency = []
    for key in elementDict.keys():
        frequency.append(float(elementDict.get(key)) / consequentLength)

    # third step: according to the frequency of every element, obtaining Huffman coding
    frequencyLength = len(frequency)
    for i in range(frequencyLength):
        frequency[i] = Node(frequency[i])
    listLength = frequencyLength
    while True:
        minimal, maximum = findTwoMinimal(frequency)
        if maximum == -1:
            break
        newNode = Node(frequency[minimal].weight + frequency[maximum].weight)
        frequency.append(newNode)
        listLength += 1
        frequency[minimal].parent = listLength - 1
        frequency[maximum].parent = listLength - 1
        frequency[minimal].charCode = 0 # the small value makes as 0
        frequency[maximum].charCode = 1 # the big value makes as 1
    codes = []
    for i in range(frequencyLength):
        parent = frequency[i].parent
        code = str(frequency[i].charCode)
        while parent != -1:
            code = str(frequency[parent].charCode) + code
            parent = frequency[parent].parent
        codes.append(code[2:])

    # Assigning an encoding for each element
    keys = elementDict.keys()
    for i in range(len(codes)):
        elementDict[keys[i]] = codes[i]
    # consequentCodes = []
    codeLength = 0
    for se in consequent:
        # consequentCodes.append(elementDict.get(se))
        codeLength += len(elementDict.get(se))
    # print consequentCodes
    return codeLength
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值