defHuffman(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
whileTrue:
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 = 0for se in consequent:
# consequentCodes.append(elementDict.get(se))
codeLength += len(elementDict.get(se))
# print consequentCodesreturn codeLength