The Smallest One First

개념 확인: Heaps and Priority Queues


우선순위 큐를 힙의 두 조건과 배열 인덱스로 읽는다.

문제 1

우선순위 큐와 큐

  1. 빈 최소 우선순위 큐에 8, 3, 11, 5를 넣은 뒤 최솟값 꺼내기를 두 번 할 때 반환값을 적는다.
  2. 같은 순서로 일반 큐에 넣고 두 번 꺼내면 반환값이 어떻게 되는지 적고 차이를 설명한다.
  3. 정렬 안 한 배열, 정렬된 배열(최솟값을 끝에 둠), 힙으로 구현할 때 넣기와 최솟값 꺼내기의 비용을 적는다.
  4. Python heapq에서 넣기, 최솟값 보기, 최솟값 꺼내기에 쓰는 이름을 적는다.
해설 펼치기
  1. 3, 5다.
  2. 8, 3이다. 큐는 도착한 차례로, 우선순위 큐는 우선순위 규칙이 꺼낼 원소를 정한다.
  3. 정렬 안 한 배열: O(1), O(n). 정렬된 배열(최솟값을 끝에 둠): O(n), O(1). 힙: O(log n), O(log n).
  4. heappush, h[0], heappop이다.
문제 2

힙인지 판정하기

배열은 레벨 순서로 담은 이진트리다.

  1. A = [2, 5, 3, 9, 6, 4]가 최소 힙인지 판정한다.
  2. B = [2, 5, 3, 4, 1, 7]이 최소 힙인지 판정하고 어기는 부모와 자식을 적는다.
  3. 루트의 왼쪽 자식 자리가 비고 오른쪽 자식만 있는 트리가 힙이 될 수 없는 이유를 적는다.
  4. A에서 두 번째로 작은 값이 어디에 있는지 적고, 세 번째로 작은 값은 왜 바로 알 수 없는지 적는다.
해설 펼치기
  1. 최소 힙이다. 완전 이진트리이고 2 ≤ 5, 3, 5 ≤ 9, 6, 3 ≤ 4다.
  2. 아니다. 인덱스 1의 부모 5가 자식 1(인덱스 4)보다 크고 자식 4(인덱스 3)보다도 크다.
  3. 마지막 레벨이 왼쪽부터 채워지지 않아 완전 이진트리가 아니므로 모양 조건을 어긴다.
  4. 루트의 두 자식 5와 3 가운데 하나라 3이다. 세 번째로 작은 값은 자식이나 손자 가운데 있을 수 있어 비교가 필요하다. 힙은 전체 정렬을 보장하지 않는다.
문제 3

배열 인덱스로 오르내리기

0부터 세는 최소 힙 배열 a = [1, 4, 2, 8, 5, 7, 3, 9]다.

  1. 인덱스 3의 왼쪽·오른쪽 자식 인덱스와 값을 적는다(없으면 없음).
  2. 인덱스 6의 부모 인덱스와 값을 적는다.
  3. 단말 노드가 놓인 인덱스 범위와 그 값들을 적는다.
  4. 1부터 세는 자료라면 인덱스 i의 두 자식과 부모 식이 어떻게 되는지 적는다.
해설 펼치기
  1. 왼쪽은 2·3 + 1 = 7로 값 9, 오른쪽은 2·3 + 2 = 8인데 n = 8이라 없다.
  2. ⌊(6 − 1)/2⌋ = 2로 값 2다.
  3. ⌊8/2⌋ = 4부터 7까지, 값은 5, 7, 3, 9다.
  4. 2i, 2i + 1, ⌊i/2⌋다.
문제 4

완전 이진트리의 높이

  1. 레벨 3까지 가득 찬 완전 이진트리의 노드 수를 적는다.
  2. 노드 수 n = 20, 100, 1,000인 완전 이진트리의 높이를 적는다.
  3. n = 31과 n = 32의 높이를 적고 차이가 생기는 이유를 적는다.
  4. 힙의 넣기와 최솟값 꺼내기가 O(log n)인 이유를 높이로 설명한다.
해설 펼치기
  1. 1 + 2 + 4 + 8 = 15다.
  2. ⌊log₂ 20⌋ = 4, ⌊log₂ 100⌋ = 6, ⌊log₂ 1,000⌋ = 9다.
  3. 31은 레벨 4까지 가득 차 높이 4, 32는 레벨 5가 새로 생겨 높이 5다. n이 두 배가 될 때마다 높이가 1 늘어난다.
  4. 힙 성질을 복원하는 상향·하향 이동이 한 갈래를 따라 높이만큼 움직이고, 모양 조건 덕분에 높이가 ⌊log₂ n⌋이다.
문제 5

힙과 BST

다음 문장이 맞는지 판단하고 틀리면 고친다.

  1. 최소 힙을 중위 순회하면 값이 오름차순으로 나온다.
  2. 최소 힙의 부등호를 뒤집으면 루트에 최댓값이 오는 최대 힙이 된다.
  3. BST에서는 루트에 항상 최솟값이 온다.
  4. 힙이 노드 기반 BST보다 부모를 찾기 쉬운 이유는 배열 인덱스 계산 때문이다.
해설 펼치기
  1. 틀렸다. 힙 성질은 부모와 자식만 정하므로 중위 순회 순서는 정해져 있지 않다. 정렬된 순서가 나오는 것은 BST다.
  2. 맞다. 나머지 절차는 그대로다.
  3. 틀렸다. BST의 루트는 삽입 순서에 따라 달라지고 최솟값은 가장 왼쪽 노드다.
  4. 맞다. 부모는 계산 한 번 ⌊(i − 1)/2⌋으로 찾고, 노드 기반 표현은 참조가 필요하다.