-
[자바로 구현하고 배우는 자료구조] 4. 힙(Heap) & 트리(Tree) (2)스터디플래너/복습하기 2021. 10. 27. 23:25
4-4. 힙:TrickleUp 함수
완전 이진 트리는 자식 노드의 번호나 부모노드의 번호를 구할 수 있다. 부모노드를 구하는 공식은 (자신의 노드번호 - 1)/2의 내림 값이고, 자식 노드를 구하는 공식은 자신의 노드 번호 * 2 + 1, 노드 번호 * 2 + 2이다. 15를 갖고있는 노드를 기준으로 부모 노드는 (4-1)/2의 내림값은 1, 자식노드는 4 * 2 + 1, 4 * 2 +2로 9, 10이다.
int lastPosition; E[] array = (E[])new Object[size]; public void add(E obj){ array[++lastPosition] = obj; trickleUp(lastPosision); } public void swap(int from, int to){ E tmp = array[from]; array[from] = array[to]; array[to] = tmp; } public void trickleUp(int position){ if(position == 0){ return; } int parent = (int)Math.floor((posision-1)/2); if(((Comparable<E>array[position].compareTo(array.parent)>0{ swap(position, parent); trickleUp(parent); } }
trickleUp을 이용하여 노드를 추가하는 과정을 코드로 표현한 것이다. 가장 마지막 자리에 새로 추가할 요소를 추가한다. 그리고 부모 노드의 값과 비교한 후, 새로 추가한 값이 크다면 부모 노드와 자리를 바꾼다. 재귀를 이용하여 부모 노드의 값보다 크다면 계속 자리를 변경한다.
4-5. 힙:TrickleDown 함수
public E remove{ E tmp = array[0]; swap(0, lastPosision--); trickleDown(0); return tmp; } public void trickleDown(int parent){ int left = 2 * parent + 1; int right = 2 * parent + 2; if(left == lastPosition && (((Comparable<E>)array[parent]).compareTo(array[left]) < 0){ swap(parent, left); return; } if(right == lastPosition && array[parent] < array[right]){ swap(parent, right); return; } if(left >= lastPosition || right >= lastPosition){ return; } if(array[left] > array[right] && array[parent] < array[left]){ swap(paretn, left); trickleDwon(left); } else if(array[parent]<array[right]){ swap(parent, right); trickleDown(right); } }
trickleDown함수를 이용하여 노드를 제거하는 과정을 코드로 구현한 것이다. 노드를 제거할 때 루트를 제거하고 가장 마지막 위치에 있는 노드를 루트에 입력한다. 그 다음 오른쪽 자식과 왼쪽 자식을 구해서 크기를 비교한다. 여기서도 재귀를 이용하여 데이터의 크기를 비교하여 제자리로 이동할 때 까지 trickleDown을 반복한다.
4-6. 힙:정렬
임의의 숫자 배열에 trickleDown을 반복하면 배열을 정렬할 수 있다. 이를 힙 정렬 알고리즘이라 한다. 힙 정렬 알고리즘의 시간 복잡도는 O(n log n)이다. 새로운 배열을 요구하지 않고 기존 배열 내에서 순서만 바꾸면 되는 것이 장점이다.
'스터디플래너 > 복습하기' 카테고리의 다른 글
[자바로 구현하고 배우는 자료구조] 4. 힙(Heap) & 트리(Tree) (4) (0) 2021.11.01 [자바로 구현하고 배우는 자료구조] 4. 힙(Heap) & 트리(Tree) (3) (0) 2021.10.30 [자바로 구현하고 배우는 자료구조] 4. 힙(Heap) & 트리(Tree) (1) (0) 2021.10.26 [자바로 구현하고 배우는 자료구조] 3. 해시(Hash) (4) (0) 2021.10.25 [자바로 구현하고 배우는 자료구조] 3. 해시(Hash) (3) (0) 2021.10.24