<힙 구조 O>

<힙 구조 X>




class MaxHeap:
def __init__(self):
self.heap = []
def heappush(self, item):
self.heap.append(item)
self._siftup(len(self.heap) - 1)
def _siftup(self, idx):
parent = (idx - 1) // 2
while idx > 0 and self.heap[idx] > self.heap[parent]:
self.heap[idx], self.heap[parent] = self.heap[parent], self.heap[idx]
idx = parent
parent = (idx - 1) // 2
def heappop(self):
if len(self.heap) == 0
raise IndexError("힙이 비었습니다.")
if len(self.heap) == 1:
return self.heap.pop()
root = self.heap[0]
self.heap[0] = self.heap.pop()
self._siftdown(0)
return root
def heapify(self, array):
self.heap = array[:]
n = len(array)
for i in range(n // 2 - 1, -1, -1):
self._siftdown(i)
def _siftdown(self, idx):
n = len(self.heap)
largest = idx
left = 2 * idx + 1
right = 2 * idx + 2
if left < n and self.heap[left] > self.heap[largest]:
largest = left
if right < n and self.heap[right] > self.heap[largest]:
largest = right
if largest != idx:
self.heap[idx], self.heap[largest] = self.heap[largest], self.heap[idx]
self._siftdown(largest)
그러면 최대 힙은 어떻게? -> 값들을 모두 음수로 바꾸면 최소 힙으로 최대 힙처럼 사용 가능. 결과의 부호만 잘 처리하면 됨
import heapq
priority_queue = []
heapq.heappush(priority_queue, (3, "3순위 작업"))
heapq.heappush(priority_queue, (1, "1순위 작업"))
heapq.heappush(priority_queue, (2, "2순위 작업"))
print(priority_queue)
# [(1, "1순위 작업"), (3, "3순위 작업"), (2, "2순위 작업")]
while priority_queue:
task = heapq.heappop(priority_queue):
print(task)
# (1, "1순위 작업")
# (2, "2순위 작업")
# (3, "3순위 작업")
def backtracking(node v):
if promising(v):
if there is a solution at v:
find the solution
else:
for child of v:
backtracking(child)