힙구조에 대해 설명해보세요.

  • 힙구조

힙(Heap)은 내부노드(internal node)에 키와 요소(key,element)를 저장한 이진트리로 다음과 같은 두 가지 특징을 갖는 것을 말한다.

트리를 T, 임의 내부노드를 v 라고 하면 다음과 같다:

① 뿌리노드를 제외한 각 내부노드는 또는 이다. (즉, 키 값은 오름차순이거나 내림차순이다.)

② 마지막 왼쪽 결합 노드들의 레벨을 제외한 다른 모든 레벨들은 완전 이진트리를 형성한다. (즉, 레벨 포화 상태 : saturated status on level)

힙 리스트(heap list)로 표현할 때 i번째 노드의 왼쪽 자식노드(left kindnode)의 위치는 2i가 되며, i번째 노드의 오른쪽 자식노드(right kindnode)의 위치는 2i+1이고, 또한 i번째 부노드의 위치는 i/2가 된다.

[최대힙과 최소힙]

힙에는 내림차순인 최대힙과 오름차순인 최소힙이 있으며 개략적인 과정은 아래와 같다.

algorithm upHeap(Position v):

while (not isRoot(v)) and key(parent(v))>key(v) do

swapItems(v.parent(v));

v<-parent(v);

▲ 최대힙

algortihm downHeap(Position v):

while not (isExternal(leftChild(v)) and isExternal(rightChild(v)) do

if isExternal(rightChild(v)) then v<-leftChild(v)

else if key(leftChild(v))<=key(rightChild(v))

then v<-leftChild(v) else v<-rightChild(v);

if key(parent(v)) > key(v) then swapItems(v,parent(v))

else break;

▲ 최소힙

- 복잡도

힙의 시간복잡성은 O(\log n)이다. 왜냐하면 이진트리의 2^{(h-1)} \le n \le 2^h - 1속성에서,

\log_2(n+1) \le h \le (\log_2 n + 1) < \log_2(n+1) + 1이므로 힙트리의 높이가 h = \log_2(n+1) = O(\log_2 n)됨을 알 수 있다.

[예제]

다음의 내용의 테이블을 최대힙으로 정렬해 본다. [H|E|A|P|S|O|R|T]

이 테이블을 사전 순으로 정렬(즉 A<B<C<…<Y<Z)한다면 다음과 같다.

1 2 3 4 5 6 7 8

H E A P S O R T //중간지점인 p(4번째 인덱스)에서 시작

^ ^ //그의 자식은 (왼쪽 자노드 인덱스8)T>P이기 때문에 교환

H E A T S O R P //A(3번째 인덱스)로 계속되며 A의 왼쪽 자노드는 O(6번째 인덱스)가 되며 오른쪽 자노드는

^ ^ ^ //R(7번째 인덱스값)이 되는데 R>O,R>A이므로 R,A교환

H E R T S O A P //E(인덱스 2)와 그 왼쪽 자노드T(인덱스 4),오른쪽 자노드S(인덱스 5)비교

^ ^ ^ //T>S,T>E 결국 T,E교환

H T R E S O A P //계속 E(인덱스 4)는 왼쪽 자노드P(인덱스 8)과 비교교환하는데 P>E

^ ^

H T R P S O A E //H(인덱스 1)은 그의 왼쪽 자노드T(인덱스 2)와 오른쪽 자노드R(인덱스 3)

^ ^ ^ //T>R,T>H비교 교환한다.

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 //정렬 끝.

프로그래밍

스택과 큐의 차이점을 설명해보세요.

데이터베이스

스키마가 무엇이며, 그 종류에는 무엇이 있는가?

커뮤니티 Q&A

이론과 관련된 게시글이에요.

이해가 안 되거나 궁금한 점이 있다면 커뮤니티에 질문해 보세요!

게시글 작성하기