Advertisement
Guest User

Untitled

a guest
Apr 1st, 2020
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.87 KB | None | 0 0
  1. def huffman_len(arr):
  2.     class tree_node:
  3.         def __init__(self, freq=None, left=None, right=None):
  4.             self.freq = freq
  5.             self.left = left
  6.             self.right = right
  7.  
  8.     class min_heap_tree:
  9.         def heapify(self, root):
  10.             left = 2 * root + 1
  11.             right = 2 * root + 2
  12.             lowest = root
  13.  
  14.             if left < self.heap_len and self.heap[left].freq < self.heap[lowest].freq:
  15.                 lowest = left
  16.  
  17.             if right < self.heap_len and self.heap[right].freq < self.heap[lowest].freq:
  18.                 lowest = right
  19.  
  20.             if lowest != root:
  21.                 self.heap[root], self.heap[lowest] = self.heap[lowest], self.heap[root]
  22.                 self.heapify(lowest)
  23.  
  24.         def build_heap(self):
  25.             for i in range(self.heap_len // 2, -1, -1):
  26.                 self.heapify(i)
  27.  
  28.         def add_to_heap(self, node):
  29.             self.heap[self.heap_len]=node
  30.             self.heap_len+=1
  31.             self.added_last(self.heap_len - 1)
  32.  
  33.         def added_last(self, child):
  34.             if child == 0:
  35.                 return
  36.             parent = (child - 1) // 2
  37.  
  38.             if self.heap[parent].freq > self.heap[child].freq:
  39.                 self.heap[child], self.heap[parent] = self.heap[parent], self.heap[child]
  40.                 self.added_last(parent)
  41.  
  42.         def get_min(self):
  43.             res = self.heap[0]
  44.  
  45.             self.heap[0]=self.heap[self.heap_len-1]
  46.             self.heap_len-=1
  47.             self.heapify(0)
  48.             return res
  49.  
  50.         def __init__(self, arr):
  51.             self.heap = [None]*len(arr)
  52.             self.heap_len = len(arr)
  53.  
  54.             for i in range(self.heap_len):
  55.                 tmp = tree_node(arr[i])
  56.                 self.heap[i]=tmp
  57.  
  58.             self.build_heap()
  59.  
  60.     class huffman_tree:
  61.         def __init__(self):
  62.             self.root = None
  63.             self.arr=[]
  64.             self.heap=[]
  65.  
  66.         def create_tree(self, arr):
  67.             self.arr = arr
  68.             self.heap = min_heap_tree(self.arr)
  69.             parent=None
  70.  
  71.             while self.heap.heap_len > 1:
  72.                 left = self.heap.get_min()
  73.                 right = self.heap.get_min()
  74.  
  75.                 parent = tree_node(left.freq + right.freq, left, right)
  76.  
  77.                 self.heap.add_to_heap(parent)
  78.  
  79.             self.root = parent
  80.  
  81.         def get_code_len(self):
  82.             def _get_code_len(root, i):
  83.                 if root is None:
  84.                     return 0
  85.                 if root.right is None and root.left is None:
  86.                     return i*root.freq
  87.                 return _get_code_len(root.left, i + 1)+_get_code_len(root.right,  i + 1)
  88.  
  89.             return _get_code_len(self.root, 0)
  90.  
  91.     tree=huffman_tree()
  92.     tree.create_tree(arr)
  93.  
  94.     return tree.get_code_len()
  95.  
  96.  
  97. print(huffman_len([200, 700, 180, 120, 70, 30]))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement