Skip to content

문제 3 · d-힙의 삽입·삭제 연산

문제 3 [2점]

d-힙d-heap의 삽입, 삭제 연산을 엄밀하게 서술(1점)하고, 그 이유를 설명(1점)하시오.

풀이 및 해설

d-힙이란

d-힙은 모든 내부 노드가 최대 d개의 자식을 갖는 완전 d-진 트리로 표현한 힙이다. 이진 힙(d=2)의 일반화이며, 배열에 저장한다. 1-기반 배열에서 i번 노드의

  • 부모: i1d
  • 자식: d(i1)+2, d(i1)+3, , di+1

삽입(insert)

  1. 새 원소를 배열의 마지막(가장 끝) 자리에 넣어 완전 트리 형태를 유지한다.
  2. 이 원소를 부모와 비교하며, 부모보다 작으면(최소 힙 기준) 부모와 교환하는 상향 이동percolate up을 힙 순서가 만족될 때까지 반복한다.

트리 높이가 logdN 이므로 상향 이동은 각 단계에서 부모 한 번만 비교한다.

insert=O(logdN)

삭제(deleteMin)

  1. 루트(최솟값)를 꺼내고, 배열의 마지막 원소를 루트 자리로 옮긴다.
  2. 이 원소를 d개 자식 중 가장 작은 자식과 비교하여, 자기보다 작으면 그 자식과 교환하는 하향 이동percolate down을 반복한다.
deleteMin=O(dlogdN)

이유

트리의 높이는 logdN 이다. 삽입은 각 층에서 부모와 한 번만 비교하므로 높이에 비례해 O(logdN) 이다. 반면 삭제는 하향 이동 때 각 층에서 "가장 작은 자식"을 찾기 위해 d개 자식을 모두 비교해야 하므로 층마다 O(d), 전체는 O(dlogdN) 이 든다.

따라서 d를 키우면 트리가 낮아져 삽입은 빨라지지만, 삭제 때 자식 비교 횟수가 늘어 삭제는 느려진다. d는 이 둘 사이의 절충으로 선택한다(캐시 지역성 때문에 d=4 정도가 유리하기도 하다).

PDF