힙과 우선순위 큐(Heap and priority queue)
가장 작은(급한) 것을 늘 맨 위에 두는 이진 트리(binary tree) 구조. 넣고 꺼내는 데 O(log n)이 들고, 다익스트라 알고리즘(Dijkstra's algorithm)과 힙 정렬(heapsort)의 엔진이다.
응급실은 먼저 온 순서가 아니라 급한 순서로 환자를 봅니다. 이렇게 '가장 급한 것 꺼내기'와 '새 것 넣기'를 되풀이하는 자료 구조가 우선순위 큐입니다. 목록을 늘 정렬된 채로 두면 새 것을 제자리에 끼워 넣는 데, 정렬하지 않고 두면 가장 작은 것을 처음부터 찾는 데 n에 비례하는 시간이 듭니다. 힙(heap)을 쓰면 두 조작 모두
(최소) 힙은 모든 부모가 자식보다 작거나 같은 이진 트리(tree)입니다. 형제끼리의 순서는 따지지 않으니 정렬보다 훨씬 느슨한 조건이지만, 가장 작은 원소(element)가 늘 뿌리에 있다는 것만은 보장됩니다. 트리를 위층부터, 한 층 안에서는 왼쪽부터 빈틈없이 채우므로 연결을 따로 적을 필요 없이 배열 하나에 층별로 적으면 되고, i번 칸의 자식은 2i+1번과 2i+2번 칸에 있습니다. n개가 들어 있으면 높이는
넣을 때는 새 원소를 맨 끝 빈자리에 두고, 부모보다 작으면 자리를 바꾸며 올라갑니다. 꺼낼 때는 뿌리를 가져가고, 맨 끝 원소를 뿌리에 올린 뒤 두 자식 중 작은 쪽보다 크면 자리를 바꾸며 내려갑니다. 어느 쪽이든 한 층에 비교 한두 번이니 모두 높이의 두 배 이하, 곧
이어지는 곳. 변의 길이가 음수가 아닌 그래프에서 데이크스트라가 만든 다익스트라 최단 경로(shortest path) 알고리즘(algorithm)은 '아직 확정하지 않은 점 가운데 가장 가까운 점'을 힙에서 꺼내고, 1957년 로버트 프림이 발표한 최소 신장 트리(minimum spanning tree) 알고리즘도 지금 트리에 가장 가까운 점을 힙에서 꺼냅니다. 허프만 부호(Huffman coding)는 가장 드문 두 기호를 힙에서 꺼내 묶은 뒤 다시 넣기를 되풀이하는 욕심쟁이 알고리즘(greedy algorithm)입니다. 최대 힙과 최소 힙을 하나씩 두면 값이 계속 들어오는 동안에도 중앙값(median)을 곧바로 읽을 수 있고, 시뮬레이션에서는 다음에 일어날 사건(event)을 시각순으로 꺼내는 데 씁니다. 배열 번호를 1부터 매기면 i번 칸의 부모는 i를 이진법(binary)으로 쓰고 마지막 자리를 지운 수입니다. 예를 들어 6은 이진법으로 110이고, 마지막 자리를 지운 11은 3이므로 6번 칸의 부모는 3번 칸입니다.
이 개념이 나오는 긴 글
이 개념을 언급하는 페이지
- 중앙값
… 끝납니다. 값이 하나씩 들어올 때는, 가장 큰 값이나 가장 작은 값을 곧바로 꺼낼 수 있는 자료 구조인힙두 개에 아래 절반과 위 절반을 나눠 담아 두면 중앙값을 언제든 곧바로 꺼낼 수 있습니다.
- 최단 경로
… 경우입니다. 잠정 거리가 가장 작은 점을 빠르게 꺼내려고, 가장 작은 값을 늘 맨 앞에 두는 자료 구조인우선순위 큐(흔히 힙으로 만듭니다)에 점들을 담아 둡니다. 점마다 어느 이웃에서 왔는지 기록해 두면, 그 화살표들이 …
- 최근접 이웃 분류
… k-평균 군집은 이름표 없이 무리를 찾는 전혀 다른 방법입니다. 지금까지 찾은 가장 가까운 k개를힙에 담아 두면, 더 가까운 점이 나올 때마다 그중 가장 먼 것을 빠르게 밀어낼 수 있습니다. 예가 수백만 …
- 정렬 알고리즘
… 비교가 n \log_2 n 번을 넘지 않고, 가장 운이 좋아도 그 절반쯤은 듭니다. 힙 정렬 은 목록을힙(가장 큰 값을 늘 맨 위에 두는 트리 모양의 자료 구조)으로 만든 뒤 가장 큰 원소를 하나씩 꺼내 …
- 트리
… 탐색⟧을 자료 구조로 옮긴 것입니다. 부모가 늘 자식보다 작도록 쌓은 힙은 가장 작은 값을 늘 뿌리에 두어우선순위 큐를 만듭니다. 잎마다 기호를 달고 뿌리에서 그 잎까지 왼쪽 가지는 0, 오른쪽 가지는 1로 적으면 부호가 …
- 최소 신장 트리
… 지금 트리에서 밖으로 나가는 변 가운데 가장 짧은 것을 하나씩 붙여 나갑니다. 가장 짧은 변을 꺼내는 데우선순위 큐를 씁니다. 변 길이가 모두 다르면 최소 신장 트리는 하나뿐이라, 순서는 달라도 결과는 같은 트리입니다. …
- 허프만 부호
… 보이는 선택을 하는 욕심쟁이 알고리즘이 정확한 답을 주는 드문 예입니다. 가장 가벼운 둘을 꺼내는 데우선순위 큐를 쓰면 글자가 k가지일 때 O(k \log k) 에 끝납니다. 평균 길이는 엔트로피 H 밑으로 내려갈 …