-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHuffman.py
122 lines (98 loc) · 3.45 KB
/
Huffman.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
from __future__ import division
import scipy.io
import numpy as np
import operator
from Queue import PriorityQueue
class HuffmanNode(object):
def __init__(self, left = None, right = None, str = None, value = None):
self.left = left
self.right = right
self.str = str
self.value = value
self.code = None
def getChildren(self):
return((self.left, self.right))
def getStr(self):
return self.str
def getValue(self):
return self.value
def getCode(self):
return self.code
def setCode(self, code):
self.code = code
class HuffmanCoding :
def __init__(self):
mat = scipy.io.loadmat('freq.mat')
freqs = mat["freq"]
self.freqsList = []
self.dict_encode = {}
self.dict_decode = {}
for i in range(97, 123, 1) :
j = i - 97
node = HuffmanNode(None, None, chr(i), freqs[j][0])
self.freqsList.append((freqs[j][0], node))
tree = self.create_tree(self.freqsList)
root = tree[0][1]
root.setCode("")
self.createCodes(root)
self.createDicts(root)
def create_tree(self, frequencies):
while len(frequencies) > 1:
indexl, valuel = min(enumerate(frequencies), key=operator.itemgetter(1))
frequencies = frequencies[:indexl] + frequencies[indexl+1 :]
indexr, valuer = min(enumerate(frequencies), key=operator.itemgetter(1))
frequencies = frequencies[:indexr] + frequencies[indexr+1 :]
value = valuel[0] + valuer[0]
str = valuel[1].getStr() + valuer[1].getStr()
node = HuffmanNode(valuel, valuer, str, value)
frequencies.append((value, node))
return frequencies
def createCodes(self, root) :
code = root.getCode()
children = root.getChildren()
if(children[0] != None):
children[0][1].setCode(code + "0")
self.createCodes(children[0][1])
if(children[1] != None):
children[1][1].setCode(code + "1")
self.createCodes(children[1][1])
def createDicts(self, root) :
if(len(root.getStr()) == 1):
self.dict_encode[root.getStr()] = root.getCode()
self.dict_decode[root.getCode()] = root.getStr()
children = root.getChildren()
if(children[0] != None):
self.createDicts(children[0][1])
if(children[1] != None):
self.createDicts(children[1][1])
def encode(self, input):
output = ''
for i in range(0, len(input)) :
output = output + self.dict_encode[input[i]]
return output
def decode(self, input):
found = False
code = ''
ans = ''
i = 0
while(i <= len(input)- 1):
code = ''
found = False
while(found == False):
if(i >= len(input)) :
return "ERROR : Character out of English Alphabet"
code = code + input[i]
i = i + 1
if(self.dict_decode.has_key(code)):
ans = ans + self.dict_decode[code]
found = True
return ans
def main() :
h = HuffmanCoding()
input = raw_input("Enter input : ")
code = h.encode(input)
print('code= ', code)
raw = h.decode(code)
print('decode= ', raw)
if __name__== "__main__":
main()