Updated:

tree에서 이어지는 내용입니다.

  • 이전 포스팅 보러가기 : 트리

힙 (Heap)

max heap

7.jpg

  • complete binary tree이다.
  • 노드의 값들이 중복 가능하다.
  • 현재 노드에 있는 값이 직계후손의 값들보다 크거나 같다.

min heap

8.jpg

  • complete binary tree이다.
  • 노드의 값들이 중복 가능하다.
  • 현재 노드에 있는 값이 직계후손의 값들보다 작거나 같다.

삽입 (max heap 기준)

9.jpg

  • 삽입 위치 : complete binary tree 순서 상 그 다음 위치
  • 동작 : 초기 삽입 위치로부터 parent 쪽으로 옳은 위치를 찾아 계속 올라간다.

삭제 (max heap 기준)

10.jpg

  • 삭제 위치 : 항상 root
  • 삭제 후 complete binary tree가 되도록 재조정
    • 가장 마지막에 있는 node를 root에 놓고, 자식 node들을 비교하면서 아래 방향으로 scanning

큐(Queue), 우선순위 큐 (priority queue)

파이썬 heapq 모듈

  • list를 min heap으로 사용할 수 있도록 도와주는 모듈
  • min heap을 사용하면…
    • 원소들이 항상 정렬된 상태로 삽입·삭제
    • index 0 = 가장 작은 수 = root node = 1st priority = 가장 먼저 삭제
  • 내부 구현
    • 직계후손보다 크기가 작거나 같다.

        heap[k] <= heap[2*k+1] and heap[k] <= heap[2*k+2]
      
  • 사용 예시

      # 내장모듈 임포트
      import heapq
        
      # heapq에 사용할 리스트 생성
      heap = []
        
      # min heap에 원소 삽입
      heapq.heappush(heap,4)
      heapq.heappush(heap,1)
      heapq.heappush(heap,7)
      heapq.heappush(heap,3)
      # 이후 [1,3,7,4]로 정렬되어 있다.
        
      # min heap에서 원소 삭제
      # 참고로 원소 하나 삭제할 때마다 정렬한다!
      heapq.heappop(heap)
      # 이후 [3,4,7]로 정렬되어 있다.
        
      # 기존 리스트를 min heap으로 변환
      heap2 = [4,1,7,3,8,5]
      heapq.heapify(heap2)
      # 이후 [1,3,5,4,8,7]로 정렬되어 있다.