Skip to content

문제 11 · 배열을 힙으로 만들기

문제 11 [4점]

원소 N개를 가지는 임의의 입력 배열array을 힙heap 자료구조로 바꿀 때의 시간복잡도를 서술(1점)하고, 그 이유에 대해 설명(3점)하시오.

풀이 및 해설

시간복잡도(1점). 상향식 buildHeap(아래에서 위로 percolateDown)을 쓰면

buildHeap=O(N)

선형 시간입니다.

이유(3점). buildHeap은 배열을 완전 이진 트리로 보고, 마지막 내부 노드(인덱스 N/2 부근)부터 루트까지 각 노드에 대해 percolateDown(아래로 내리며 힙 성질 회복)을 수행합니다. 한 노드의 percolateDown 비용은 그 노드의 높이 h에 비례합니다.

얼핏 보면 노드마다 O(logN)이니 총 O(NlogN)처럼 보이지만, 이는 과대평가입니다. 핵심은 대부분의 노드가 트리 아래쪽에 몰려 있어 높이가 작다는 점입니다.

  • 높이가 h인 노드는 최대 N/2h+1개 존재합니다. (잎에 가까울수록 노드 수가 많고 높이는 작음)
  • 따라서 전체 비용은 각 노드의 높이 합에 비례합니다.
h=0logNN2h+1hNh=0h2h+1=N2h=0h2h

여기서 급수 h=0h2h=2상수에 수렴합니다. 그러므로

hN2h+1hN22=N=O(N).

즉, 높은 노드는 비용이 크지만 그 개수가 매우 적고(루트는 단 1개), 개수가 많은 잎 근처 노드는 비용이 거의 0이라, 높이의 총합이 O(N)으로 억눌려 전체가 선형 시간이 됩니다.

(참고: 원소를 하나씩 insert로 넣는 방식은 각 삽입이 O(logN)이라 총 O(NlogN)이 됩니다. buildHeap이 더 빠릅니다.)

👉 실습(C++)에서 확인하기

PDF