encode
και decode
, που κωδικοποιούν μια λέξη με το δεδομένα Huffman κώδικα και την αποκωδικοποιούν.# Huffman Coding in python -- code from https://www.programiz.com/dsa/huffman-coding
string = 'BCAADDDCCACACACEEFFFGGGGGCCCCCCCCCCCCCCCCCCCCCC' # από εδώ παίρνουμε τις συχνότητες των γραμμάτων
# Creating tree nodes
class NodeTree(object):
def __init__(self, left=None, right=None):
self.left = left
self.right = right
def children(self):
return (self.left, self.right)
def nodes(self):
return (self.left, self.right)
def __str__(self):
return '%s_%s' % (self.left, self.right)
# Main function implementing huffman coding
def huffman_code_tree(node, left=True, binString=''):
if type(node) is str:
return {node: binString}
(l, r) = node.children()
d = dict()
d.update(huffman_code_tree(l, True, binString + '0'))
d.update(huffman_code_tree(r, False, binString + '1'))
return d
# Calculating frequency
freq = {}
for c in string:
if c in freq:
freq[c] += 1
else:
freq[c] = 1
freq = sorted(freq.items(), key=lambda x: x[1], reverse=True)
nodes = freq
while len(nodes) > 1:
(key1, c1) = nodes[-1]
(key2, c2) = nodes[-2]
nodes = nodes[:-2]
node = NodeTree(key1, key2)
nodes.append((node, c1 + c2))
nodes = sorted(nodes, key=lambda x: x[1], reverse=True)
huffmanCode = huffman_code_tree(nodes[0][0])
print(' Char | Huffman code ')
print('----------------------')
for (char, frequency) in freq:
print(' %-4r |%12s' % (char, huffmanCode[char]))
Ακολουθούν οι δύο συναρτήσεις encode
και decode
που γράψαμε στο μάθημα για την κωδικοποίηση και αποκωδικοποίηση μιας λέξης. Σημειωτέον ότι κατά κανόνα κωδικοποιούμε μια λέξη με τον κώδικα Huffman που φτιάξαμε από την ίδια τη λέξη αυτή. Δεν κάνουμε δηλ. αυτό που κάναμε παρακάτω το οποίο ως μόνο σκοπό του έχει να ελέγξει ότι οι δύο συναρτήσεις δουλεύουν σωστά.
def encode(word, hc): # Κωδικοποιούμε μια λέξη με τον κώδικα Huffman hc (σε μορφή dictionary όπως παραπάνω)
s=''
for a in word:
s += hc[a]
return s
def decode(codeword, hc): # Αποκωδικοποιούμε τη λέξη. Λειτουργεί αναδρομικά.
if codeword=='': return ''
for i in range(len(codeword)):
c = codeword[:i+1]
for symbol in hc.keys():
if hc[symbol] == c:
return symbol + decode(codeword[i+1:], hc)
continue
# Δοκιμάζουμε τις συναρτήσεις encode και decode. Βεβαιωνόμαστε ότι η λέξη που προκύπτει από το decode
# είναι η αρχική
ee = encode('ABCDDBADDEFFFFFF', huffmanCode)
print(ee)
print(decode(ee, huffmanCode))