힙
heap queue
#
기본개념
트리기반의 자료구조로 데이터에서
최대값과 최소값
을 빠르게 찾기 위해 고안된완전 이진 트리
(Complete Binary Tree)
특징
- 최대값
- 항상 큰값이 상위 레벨에 있고 작은 값이 하위 레벨에 있다.
-
부모노드 < 자식 노드
- 최소값
-
자식노드 > 부모노드
-
2n+1 부터 시작하는게 편하다
- 이미 파이썬에는 함수로 내장되어 있다
- 링크
- [[python-heapq]]{힙큐에대한 내용은여기}
함수 설명 (max heap)
__init__
배열을 만들어 초기화 1. [None]으로 초기화하여 인덱스를 1부터 카운팅
def __init__(self):
self.items = [None]
__len__
Magic method 로 기존에 내장되어 있던 len함수를 overriding 해서 나만의 함수로 만든다
def __len__(self):
return len(self.items) - 1
push-up
(위로 올려 비교 )
현재 인덱스와 부모인덱스를 비교하여 자식노드의 값이 부모노드보다 작은면 바꾸기
def _push_up(self):
cur = len(self)
parent = cur // 2
while parent > 0:
if self.items[cur] > self.items[parent]:
self.items[cur], self.items[parent] =self.items[parent], self.items[cur]
cur = parent
parent = cur // 2 #2를 나눈 나머지는 버린다
push-down
(밑으로 내려서 마지막에 있을때 삭제)
현재 인덱스의
- 2 * cur <- 왼쪽 노드
- 2 * cur +1 <- 오른쪽 노드
def _push_down(self, cur):
biggest = cur
left = 2* cur
right = 2 * cur + 1
if left <= len(self) and self.items[left] > self.items[biggest]:
biggest = left
if right <= len(self) and self.items[right] > self.items[biggest]:
biggest = right
if biggest != cur:
self.items[cur], self.items[biggest] = self.items[biggest], self.items[cur]
insert
(추가)
값을 리스트에 넣어준다 그리고 push_up 함수를 불러와 계속 비교한다
def insert(self, k):
self.items.append(k)
self._push_up()
extract
(추출)
값을 아래로 내리면서 제일 아래로 내리고 마지막은 삭제 그리고