힙 (자료 구조): 두 판 사이의 차이

내용 삭제됨 내용 추가됨
편집 요약 없음
1번째 줄:
[[Image:Max-Heap.svg|thumb| 1부터 100까지의 정수를 저장한 최대 힙의 예시. 모든 부모노드들이 그 자식노드들보다 큰 값을 가진다.]]
 
'''힙'''(Heap)은 최댓값 및 최솟값을 찾아내는 연산을 빠르게 하기 위해 고안된 [[이진 트리|완전이진트리]](Complete binary tree)를 기본으로 한 자료구조(tree-based structure)로서 다음과 같은 heap 속성(property)을 만족한다.
* A가 B의 부모노드(parent node) 이면, A의 key값과키(key)값과 B의 key값키값 사이에는 일정한 대소관계가 성립한다.
 
힙에는 두가지 종류가 있으며, 부모노드의 key값이키값이 자식노드의 key값보다키값보다 항상 큰 힙을 '최대 힙', 부모노드의 key값이키값이 자식노드의 key값보다키값보다 항상 작은 힙을 '최소 힙'이라고 부른다.
 
key값의키값의 대소관계는 오로지 부모노드와 자식노드 간에만 성립하며, 특히 외의형제 다른사이에는 노드들과는대소관계가 연관성을정해지지 찾아볼 수 없다않는다.
 
각 노드의 children 의자식노드의 최대개수는 heap 의힙의 종류에 따라 다르지만, 대부분의 경우는 children 의자식노드의 개수가 최대 2개인 [[이진 힙]](binary heap)을 사용한다.
 
힙에서는 가장 높은(혹은 가장 낮은) 우선순위를 가지는 노드가 항상 루트노드에뿌리노드에 오게 되는 특징이 있으며, 이를 응용하면 [[우선순위 큐]]와 같은 추상적 자료형을 구현할 수 있다.
 
== 이진 힙 ==
이진 힙(binary heap)은힙은 내부노드(internal node)에 키(key)와 요소(element)를 저장한 [[이진 트리]]로 다음과 같은 두 가지 특징을 갖는 것을 말한다.
 
트리를 T, 임의 내부노드를 v 라고 하면 다음과 같다:
20번째 줄:
# 마지막 왼쪽 결합 노드들의 레벨을 제외한 다른 모든 레벨들은 완전 이진트리를 형성한다.<ref>레벨 포화 상태(saturated status on level)</ref>
 
힙 리스트(heap list)로 표현할 때 i번째 노드의 왼쪽 자식노드(left kindnode)의자식노드의 위치는 2i가 되며, i번째 노드의 오른쪽 자식노드(right kindnode)의자식노드의 위치는 2i+1이고, 또한 i번째 부노드의노드의 부모노드의 위치는 i/2가 된다.
 
=== 복잡도 ===
27번째 줄:
== 예제 ==
 
다음의 내용의 테이블을배열을 최대힙으로 정렬해구성하는 본다과정을 보여준다.
<code><nowiki>[H|E|A|P|S|O|R|T]</nowiki></code>
 
테이블을배열을 사전 순으로순서에 따라 정렬(즉, A<B<C<…<Y<Z)한다면 힙으로 구성하는 과정은 다음과 같다.
 
<font color="0000FF">1 2 3 4 5 6 7 8</font>
45번째 줄:
T H R P S O A E //계속 H를 비교 교환하게 되는데,H(인덱스 2)이므로 왼쪽 자노드P(인덱스 4),오른쪽 자노드
^ ^ ^ //S(인덱스5)에서 S>P,S>H비교 교환하게 된다.
T S R P H O A E //정렬끝힙 구성 끝.
 
힙 구성 결과, 뿌리노드인 T는 그 자식노드인 S, R과 비교할 때 T<S, T<R의 관계를 가지며, 동일한 관계가 모든 노드와 그 자식노드에 대해 성립함을 볼 수 있다.
== 코드 ==
=== 의사 코드 ===
이진 트리를 힙으로 구성하는 과정의 개략적인 의사코드는 아래와 같다.
 
==== 최대 힙 ====