컴퓨터알고리즘#7
LeeMir, 31 March 2021
힙과 힙정렬
힙
- 내부노드에 키를 저장하며 다음 두가지 속성을 만족하는 이진트리
- 힙순서(최소 힙의 경우)
- 루트를 제외한 모든 내부노드 v에 대해, key(v) >= key(parent(v))
- 자식 노드가 항상 부모 노드보다 크거나 같음(중복 허용)
- 완전 이진 트리
- 왼쪽부터 채우는 이진 트리
- 트리에서 깊이가 i인 노드는 2^(i)개 존재
- 깊이 h-1에서 항상 내부 노드가 외부 노드의 왼쪽에 있음
- 외부 노드 : null인 leaf 노드
- 힙순서(최소 힙의 경우)
- 힙을 사용하여 우선순위 큐 구현 가능
- 마지막 노드의 위치를 관리
- 배열을 이용해 구현한 힙과 리스트를 이용해 구현한 힙은 대부분의 경우 시간 복잡도가 동일하고, 마지막 노드를 찾는 데에 있어서 배열의 경우 O(1), 리스트는 순회를 해야해서 O(log n)임
- 삽입 메쏘드
- 가장 첫 외부 노드에 삽입 후, 확장(자식 노드로 두 외부 노드를 연결)
- upHeap 수행
- 힙 순서가 꼬였을 수 있으므로 마지막 노드(삽입한 노드)로부터 루트까지 부모와 자식을 비교하면서 정리함
- 삭제 메쏘드
- 루트에 마지막 노드의 key를 집어 넣음, 원래 루트 값은 반환할 값
- 마지막 노드는 삭제(외부노드화)
- downHeap 수행
- 루트부터 자식과 비교해나가면서 제자리를 찾게함
- 왼쪽 자식 오른쪽 자식 중, 값이 더 작은 자식과 비교
힙 정렬
- 선택 정렬이나 삽입 정렬과 같은 2차 정렬 알고리즘보다 훨씬 빠름
- O(n log n)
- 빈 배열에 힙에서 삭제(루트)한 값을 하나씩 집어 넣으면 자동으로 작은 값부터 채워짐