Advertisement
Guest User

Untitled

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