created : 2023-12-13
Key와 Value 쌍을 저장하는 데이터 구조, 특히 Key를 검색어로 주었을 때, 대응되는 value를 빠르게 찾아주는 구조
Ex)
| Domain Name | IP Address |
| (Key) | (Value) |
| www.knu.ac.kr | 155.230.11.1 |
| computer.knu.ac.kr | 155.230.13.8 |
특징
Unordered List 사용
LinkedList 또는 배열에 원소를 정렬하지 않고 저장하는 방식
Ordered Array 사용
원소를 정렬한 상태로 배열에 저장하는 방식.
정렬을 위해서 각 원소의 index가 필요 -> 배열에 저장
BST(Binary Search Tree) 사용
트리의 각 노드에 하나의 (Key, Value) 쌍 저장
자식이 0 ~ 2 개, 왼쪽 자식 key < 부모 key < 오른쪽 자식 key 를 만족하는 트리
Hash 값 사용
hash 함수 h(key) 계산한 값을 index로 사용해 hash table의 저장할 위치에 바로 접근 (상수 시간)
[2-3 Tree]
각 노드에 2개까지의 Key 저장을 허용 & 3개까지의 자식 허용 (트리 깊이를 최소화하기 위함)
2 - node -> 1 개의 key, 2 개의 자식 가진 노드 (BST와 동작 방식 같음)
3 - node -> 2 개의 key, 3 개의 자식 가진 노드
- key < k1 : 왼쪽 자식으로 이동
- k1 < key < k2 : 가운데 자식으로 이동
- k2 < key : 오른쪽 자식으로 이동
2-3 Tree 방식으로 Symbol Table 을 구현한다.
Put 메서드에 대해서 노드 타입에 따라 다음과 같이 수행한다.

임시로 4-Node를 만든 후 가운데 key를 부모 노드에 추가하며 2개의 2-Node를 만든다.
부모노드가 4-Node가 된다면 중간 노드를 새로운 Root로 만들면서 트리깊이를 1 증가시킨다.
한쪽으로 노드가 몰리게되면 (4-Node) 해당 노드가 Split하면서 양쪽이 균형잡힌 트리로 분화하게 된다.
root ~ leaf 노드 까지 모든 경로가 같은 길이를 유지한다.
따라서, 깊이가 ~logN을 보장하게 된다.
대부분의 작업이 O(logN)에 비례하게 된다.
트리를 순회하며 만나는 노드의 타입이 2-node, 3-node, 4-node가 있고 구분하여 처리할 필요가 있다.
3-node 따라 탐색해 내려갈 때는 대소 비교 여러 회 필요
Leaf에 새 값 추가 후 root로 거슬러 올라가며 4-node split 필요
4-node split할 때 여러 링크를 정확한 위치에 바꾸어 연결해 주어야 하는 등의 구현적 어려움이 있다.
[LLRB] Left-Leaning Red-Balck
내부 연결(Red)과 외부 연결(Black) 구분하여 표현하는 방식
내부 연결은 왼쪽으로 기울어지도록 표현 -> 작은 값을 큰 값 왼쪽에 둔다.



핵심 1.
Symbol Table 이란 key와 Value 쌍을 저장하는 데이터 구조이다.
Key를 활용해 해당 key를 가지는 데이터를 조회하는 기능을 제공한다.
핵심 2.
Symbol Table 을 구현하는 방법은
핵심 3.
정렬되지 않은 List의 조회 기능은 O(N)에 비례한다
정렬된 List의 조회 기능은 이진탐색을 활용할 수 있어 O(logN)에 비례하지만, 삽입 시 원소의 순서를 유지하기 위해 O(N)에 비례한 시간이 걸리는 단점이 있다.
이진트리의 조회 기능은 트리의 깊이에 비례한다. 다만 편향된 트리가 생길 수 있으며 이때 깊이가 N이 될 수 있다.
해쉬함수를 활용한 테이블의 조회 및 삽입 기능은 상수시간에 수행된다. 다만 key와 근접한 값 탐색 혹은 원소 순서 파악 등에는 불리하다.
핵심 4.
이진트리를 개선한 방식으로 2-3 Tree 를 이용하여 Table을 구현할 수 있다.
2-3 Tree를 활용하면 트리의 깊이가 logN 으로 유지시킬 수 있어 값 조회 기능의 성능을 향상 시킬 수 있다.
깊이 유지가 되는 이유는 4-node 가 되는 경우 split하여 균형잡힌 트리로 분리되기 때문
핵심 5.
2-3 Tree 를 구현하기 위해 기존의 BST 트리를 구현한 코드 재활용할 수 있다.
이것이 LLRB(Left Leaning Red Black)이다.