3. POSTECH Computer Algorithm Team
Concept
- 선형 자료 구조의 경우, 입력이 되는 순서에 따라 데이터들의 순서가 결정된다.
- 하지만 저번 시간에 배운 트리의 경우, 우리가 원하는 순서대로 데이터들을 정리할 수 있다.
- 즉, 우선순위(priority)를 결정할 수 있다.
- 그 중에서 가장 대표적인 것이 이진 검색 트리이다.
이진 검색 트리
4. POSTECH Computer Algorithm Team
Concept
이진 검색 트리는 다음과 같은 조건으로 유지된다.
1. 각 노드의 자식 노드는 최대 2개이다.
2. 각 노드는 왼쪽 자식이 부모 노드보다 작고, 오른쪽 자식이 부모 노드보다 크다.
Q) 데이터들이 이진 검색 트리로 저장되어 있을 때, k번째로 큰 노드를 찾아보자.
이진 검색 트리
5. POSTECH Computer Algorithm Team
Concept
- 이진 검색 트리의 시간복잡도는 트리의 높이가 된다.
- 한 번 검색을 할 때 level이 무조건 1씩 증가하므로 최악의 경우는 트리의 맨 끝까지 갔을 때이다. O(h)
Q) 최선, 최악의 경우 시간복잡도는 어떻게 될까?
이진 검색 트리
6. POSTECH Computer Algorithm Team
Concept
- 이제 이진 검색 트리의 삽입과 삭제를 살펴보자.
- 삽입은 기본적인 탐색을 하며 현재 노드보다 작으면 왼쪽 서브 트리로, 크면 오른쪽 서브 트리로 탐색 과정을 재
귀적으로 실행한다.
- 만약 리프 노드를 찾게 되면 이진 검색 트리의 조건에 맞춰 왼쪽 또는 오른쪽 노드로 삽입하면 된다.
- 삭제는 이렇게 쉽게 되지 않는다. 왜냐하면 삭제를 하게 되면 연결이 끊어지게 되기 때문이다.
Q) 삭제는 어떤 서브 트리의 루트 노드가 사라지는 것으로 생각할 수 있다. 이런 경우 루트 노드의 왼쪽 서브 트리
와 오른쪽 서브 트리를 어떻게 재정렬할 수 있을까?
이진 검색 트리
7. POSTECH Computer Algorithm Team
Concept
- 앞에서 말했듯이 이진 검색 트리의 탐색은 최악의 경우 O(n)이 되기 때문에 일반적인 검색과 다를 바가 없다.
- 그래서 항상 최선의 경우인 O(logn)이 되도록 만들어야 한다.
- 이에 대한 알고리즘들을 ‘균형 잡힌 이진 트리’라고 한다.
- 기본 적인 균형 잡힌 이진 트리의 조건은 어떤 노드의 두 자식 서브 트리의 높이 차가 1이하여야한다는 것이다.
균형 잡힌 이진 트리
8. POSTECH Computer Algorithm Team
Concept
- 일반적으로 STL의 set, map 같은 경우 red-black tree나 AVL tree라는 알고리즘들을 이용하여 균형 잡혀져 있다.
- 하지만 이런 알고리즘들은 구현이 까다롭다.
- 그리고 k번째 수 찾기 등을 O(logn)에 지원하지 않기 때문에 평균적으로 균형 잡힌 이진 트리를 만드는 ‘트립
(treap)’을 사용한다.
균형 잡힌 이진 트리
9. POSTECH Computer Algorithm Team
Concept
- 트립의 기본 조건은 이진 검색 트리와 힙(heap)을 합쳐 놓은 듯한 모양새다.
1. 현재 노드의 왼쪽 자식 노드는 부모 노드보다 작고, 오른쪽 자식 노드는 부모 노드보다 크다.
2. 자식 노드들의 우선순위보다 부모 노드의 우선순위가 높아야 한다.
- 이진 검색 트리와는 다르게 우선순위라는 개념이 추가된다.
Q) 우선순위는 어떻게 매겨야 균형 잡힌 이진 트리가 만들어질까?
트립
10. POSTECH Computer Algorithm Team
Concept
A) 노드를 하나 씩 넣을 때, 랜덤하게 우선 순위를 정해준다. 이러면 트리의 높이의 기댓값이 O(logn)이 되어 우리
가 원하는 형태로 만들어진다.
- 삽입은 크게 두 가지 상황을 생각해야 된다. 현재 삽입하는 노드의 우선순위가 현재 노드보다 클 때랑 작을 때이
다.
- 만약 현재 노드보다 우선순위가 작으면 자식들 중 크기가 작은 자식 노드를 루트로 하는 서브 트리에서 이 과정
을 재귀적으로 반복한다.
- 하지만 우선순위가 크면 이 노드를 삽입하는 노드의 자식으로 넣어야 하는데, 그냥 넣으면 높이가 1 증가하여 균
형이 깨진다.
트립
11. POSTECH Computer Algorithm Team
Concept
- 만약 루트 노드가 삽입 노드보다 작으면 왼쪽 서브 트리 + 루트 노드 / 오른쪽 서브 트리로 쪼개면 되고 반대의
경우, 왼쪽 서브 트리 / 루트 노드 + 오른쪽 서브 트리로 쪼갠다.
- 이들을 삽입 노드의 자식으로 두면 새로 생성된 트리의 왼쪽 서브 트리와 오른쪽 서브 트리의 높이 차가 1로 유
지되어 균형은 맞춰지게 된다.
- 삭제는 이진 검색 트리의 삭제와 거의 동일하다. 우선순위에 따라 루트를 왼쪽 자식 노드로 할지 오른쪽 자식 노
드로 할지 결정하면 된다.
트립
13. POSTECH Computer Algorithm Team
More
- https://algospot.com/judge/problem/read/NERD2
- https://algospot.com/judge/problem/read/INSERTION