Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
afnan47
GitHub Repository: afnan47/sem7
Path: blob/main/DAA Python/2_huffman_encoding.py
418 views
1
import heapq
2
3
# Creating Huffman tree node
4
class node:
5
def __init__(self,freq,symbol,left=None,right=None):
6
self.freq=freq # frequency of symbol
7
self.symbol=symbol # symbol name (character)
8
self.left=left # node left of current node
9
self.right=right # node right of current node
10
self.huff= '' # # tree direction (0/1)
11
12
def __lt__(self,nxt): # Check if curr frequency less than next nodes freq
13
return self.freq<nxt.freq
14
15
def printnodes(node,val=''):
16
newval=val+str(node.huff)
17
# if node is not an edge node then traverse inside it
18
if node.left:
19
printnodes(node.left,newval)
20
if node.right:
21
printnodes(node.right,newval)
22
23
# if node is edge node then display its huffman code
24
if not node.left and not node.right:
25
print("{} -> {}".format(node.symbol,newval))
26
27
if __name__=="__main__":
28
chars = ['a', 'b', 'c', 'd', 'e', 'f']
29
freq = [ 5, 9, 12, 13, 16, 45]
30
nodes=[]
31
32
for i in range(len(chars)): # converting characters and frequencies into huffman tree nodes
33
heapq.heappush(nodes, node(freq[i],chars[i]))
34
35
while len(nodes)>1:
36
left=heapq.heappop(nodes)
37
right=heapq.heappop(nodes)
38
39
left.huff = 0
40
right.huff = 1
41
# Combining the 2 smallest nodes to create new node as their parent
42
newnode = node(left.freq + right.freq , left.symbol + right.symbol , left , right)
43
# node(freq,symbol,left,right)
44
heapq.heappush(nodes, newnode)
45
46
printnodes(nodes[0]) # Passing root of Huffman Tree
47