fahadkalil

max_heap_v2_2022

Sep 13th, 2022
273
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.45 KB | None | 0 0
  1. # Classe modificada para permitir a indicação de quantidade de itens permitidos
  2. # na Heap
  3.  
  4. # Foram definidos metodos e variaveis privadas (private)
  5.  
  6. class MaxHeap:
  7.     def __init__(self, max_size=None):
  8.         self.__heap = [0]
  9.         self.__max_size = None
  10.         if max_size is not None and isinstance(max_size, int):
  11.             if max_size <= 0:
  12.                 raise ValueError("max_size precisa ser maior que zero.")
  13.             self.__max_size = max_size
  14.  
  15.     def is_empty(self): ## retorna True se estrutura esta vazia
  16.         if len(self.__heap) - 1 == 0:
  17.             return True
  18.         return False
  19.  
  20.     def is_full(self):
  21.         if self.__max_size is not None:
  22.             if len(self.__heap) - 1 == self.__max_size:
  23.                 return True
  24.         return False
  25.  
  26.     def put(self, item):
  27.         if not self.is_full():
  28.             self.__heap.append(item)
  29.             self.__floatUp(len(self.__heap) - 1)
  30.         else:
  31.             raise Exception("Heap Lotada!")
  32.  
  33.     def get(self):
  34.         if len(self.__heap) > 2:
  35.             self.__swap(1, len(self.__heap) - 1)
  36.             max = self.__heap.pop()
  37.             self.__bubbleDown(1)
  38.         elif len(self.__heap) == 2:
  39.             max = self.__heap.pop()
  40.         else:
  41.             max = False
  42.         return max
  43.  
  44.     def peek(self):
  45.         if self.__heap[1]:
  46.             return self.__heap[1]
  47.         return False
  48.  
  49.     def __swap(self, i, j):
  50.         self.__heap[i], self.__heap[j] = self.__heap[j], self.__heap[i]
  51.  
  52.     def __floatUp(self, index):
  53.         parent = index//2
  54.         if index <= 1: # nao faz nada se for raiz
  55.             return
  56.         elif self.__heap[index] > self.__heap[parent]:
  57.             self.__swap(index, parent)
  58.             self.__floatUp(parent)
  59.  
  60.     def __bubbleDown(self, index):
  61.         left = index * 2
  62.         right = index * 2 + 1
  63.         maior = index
  64.         if len(self.__heap) > left and self.__heap[maior] < self.__heap[left]:
  65.             maior = left
  66.         if len(self.__heap) > right and self.__heap[maior] < self.__heap[right]:
  67.             maior = right
  68.  
  69.         if maior != index:
  70.             self.__swap(index, maior)
  71.             self.__bubbleDown(maior)
  72.  
  73. ## TESTES ##
  74. if __name__ == '__main__':     ## teste para que ao importar esse arquivo nao considere esse trecho                  
  75.     h = MaxHeap(4)
  76.     h.put(45)
  77.     h.put(55)
  78.     h.put(33)
  79.  
  80.     print(h.get())
  81.     print(h.get())
  82.     print(h.get())
  83.  
  84.  
Add Comment
Please, Sign In to add comment