# Heap

# 정의

  • 힙은 ‘이진트리’ 이되 ’완전 이진 트리’이다. 그리고 모든 노드에 저장된 값은 자식 노드에 저장된 값보다 크거나 같아야 한다. 즉 루트 노드에 저장된 값(또는 우선순위)이 가장 커야 한다.
  • 루트로 올라갈수록 저장된 값이 커지는 완전 이진 트리는 최대 힙. 작아지는 완전 이진트리는 최소 힙
  • 영단어 heap은 ’무엇인가를 차곡차곡 쌓아 올린더미’라는 뜻.

# 데이터 저장과정

  • 자식 노드 데이터의 우선순위 <= 부모 노드 데이터의 우선순위
  • 새로운 데이터는 우선순위가 제일 낮다는 가정하에서 ’마지막 위치’에 저장. 그리고는 부모 노드와 우선순위를 비교해서 위치가 바뀌어야 한다면 바꿔준다. 제대로 된 위치를 찾을 때까지 반복.

# 데이터 삭제과정

  • 힙에서 루트 노드를 삭제한 다음에 이 부분을 어떻게 채울 것인가?
    • 마지막 노드를 루트 노드의 자리로 옮긴 다음에, 자식 노드와의 비교를 통해서 제 자리를 찾아가게 한다.
    • 두 개의 자식노드중 우선순위가 높은 노드와 교환해 나간다.

# 힙의 구현에 어울리는 자료구조

  • 배열을 기반으로 구현하는 것이 원칙
  • 연결리스트를 기반으로 힙을 구현하면, 새로운 노드를 힙의 ’마지막 위치’에 추가하는 것이 쉽지 않다.

# 출처

  • 윤성우의 열혈 자료구조 (오렌지미디어, 2012)
    • CH 09. 우선순위 큐와 힙