binary heap 구현 시 indexing
알고리즘 2014. 11. 28. 17:12 |binary heap 구현 시,
root 를 0 으로 하는 것과 1 로 하는 것의 차이를 보자.
* i 의 child
left child | right child | |
---|---|---|
0-based | i * 2 + 1 | (i+1) * 2 |
1-based | i * 2 | i * 2 + 1 |
* i 의 parent
i 가 left 일 때 | i 가 right 일 때 | |
---|---|---|
0-based | i / 2 | (i-1) / 2 |
1-based | i / 2 | i / 2 |
root 의 index 를 1 로 하여 구현하는 것이 계산이 더 간단하다.
뿐만 아니라 다음과 같은 이점이 있다.
depth 0 | 1 | |||||||
depth 1 | 2 | 3 | ||||||
depth 2 | 4 | 5 | 6 | 7 | ||||
depth 3 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
index 를 2 진수로 변환하면, 같은 depth 인 경우 자리 수가 같아진다.
depth 0 | 1 | |||||||
depth 1 | 10 | 11 | ||||||
depth 2 | 100 | 101 | 110 | 111 | ||||
depth 3 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
또한 가장 왼쪽 node 의 index 는 항상 첫 자리가 1 이고 나머지 자리는 모두 0 이 된다.
가장 마지막 node 의 index 는 항상 모든 자리가 1 이다.
이런 이유로, index 값만으로 depth 를 알 수 있고 그 외 유용한 연산을 더 빠르고 간편하게 해 낼 수 있다.
특별한 이유가 없다면 binary heap 구현은 root index 를 1 로 하는 게 좋다.