-
-
Save ringsaturn/bdb5670da21c43e98e6d46146be68228 to your computer and use it in GitHub Desktop.
Huffman coding implementation in Python
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
# Le codage de Huffman | |
# Théorie de l'information et du codage | |
# Etudiant: Boubakr NOUR <[email protected]> | |
# Universite Djilali Liabes (UDL) de Sidi Bel Abbes | |
import heapq | |
from collections import defaultdict | |
def encode(frequency): | |
heap = [[weight, [symbol, '']] for symbol, weight in frequency.items()] | |
heapq.heapify(heap) | |
while len(heap) > 1: | |
lo = heapq.heappop(heap) | |
hi = heapq.heappop(heap) | |
for pair in lo[1:]: | |
pair[1] = '0' + pair[1] | |
for pair in hi[1:]: | |
pair[1] = '1' + pair[1] | |
heapq.heappush(heap, [lo[0] + hi[0]] + lo[1:] + hi[1:]) | |
return sorted(heapq.heappop(heap)[1:], key=lambda p: (len(p[-1]), p)) | |
data = "The frog at the bottom of the well drifts off into the great ocean" | |
frequency = defaultdict(int) | |
for symbol in data: | |
frequency[symbol] += 1 | |
huff = encode(frequency) | |
print "Symbol".ljust(10) + "Weight".ljust(10) + "Huffman Code" | |
for p in huff: | |
print p[0].ljust(10) + str(frequency[p[0]]).ljust(10) + p[1] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment