this is short code written by python.
Huffman encoding and decoding
I studied using this site and write code
http://www.geeksforgeeks.org/greedy-algorithms-set-3-huffman-coding/
import random
dic = {} class MinHeapNode: def setNode(self, left, right, freq, char): self.left = left self.right = right self.freq = freq self.char = char return self def huffmanCoding(arr, freq): heapArr = [] for i in range(len(arr)): heapArr.append(MinHeapNode().setNode(None, None , freq[i], arr[i])) print(heapArr[i].freq, heapArr[i].char) while(len(heapArr)>1): left = heapArr.pop(0) right = heapArr.pop(0) insertionSort(heapArr, MinHeapNode().setNode(left, right, left.freq+right.freq, left.char + right.char)) rootheap= heapArr.pop() return rootheap def printHeap(heap, str): if heap.left != None: printHeap(heap.left, str + '0') if heap.right !=None: printHeap(heap.right, str + '1' ) if heap.left == None: print(heap.char, str) dic[heap.char] = str def insertionSort(heapArr, heap): index = len(heapArr) for i in range(len(heapArr)): if heap.freq < heapArr[i].freq: index = i break heapArr.insert(index, heap) def makeNewString(arr, freq): freqcopy = freq[:] arrcopy = arr[:] strval = '' while len(freqcopy) >0: number = random.randrange(0,len(freqcopy)) freqcopy[number] = freqcopy[number]-1 strval = strval + arrcopy[number] if freqcopy[number] == 0: freqcopy.pop(number) arrcopy.pop(number) return strval def endcoding(str): strval = '' for i in range(len(str)): strval = strval + dic[str[i]] return strval def huffmandecode(rootheap, strvalencoded): index = 0; orgstr = ''; while index < len(strvalencoded): str = getchar(rootheap, index, strvalencoded) index = index + len(dic[str]) orgstr = orgstr + str return orgstr def getchar(rootheap, index, strvalencoded): if rootheap.left == None: return rootheap.char number = int(strvalencoded[index]) if number ==0: return getchar(rootheap.left, index+1, strvalencoded) if number ==1: return getchar(rootheap.right, index+1, strvalencoded) arr = ['a', 'b', 'c', 'd', 'e', 'f'] freq = [5, 9, 12, 13, 16, 45] rootheap = huffmanCoding(arr, freq) printHeap(rootheap, '') strval = makeNewString(arr, freq) print("org ", strval) strvalencoded = endcoding(strval) print("encoded ",strvalencoded) orgencoded = huffmandecode(rootheap, strvalencoded) print("decoded ", orgencoded)
Very valuable, thanks.
ReplyDelete