그래프와 해시 테이블
그래프(Graph)의 구조와 인접 행렬 vs 인접 리스트 비교
| 비교 기준 | 인접 행렬 (Adjacency Matrix) | 인접 리스트 (Adjacency List) |
|---|---|---|
| 구현 방식 | 크기의 2차원 배열 `adj[u][v]` | 각 정점마다 연결된 정점들의 동적 배열/리스트 |
| 메모리 공간 | (간선이 적어도 고정 소모) | (실제 간선 수만큼만 소모) |
| 두 정점 연결 확인 | (`adj[u][v]` 즉시 조회) | (연결된 리스트 순회) |
| 한 정점과 연결된 모든 노드 순회 | (해당 행 전체 칸 확인) | (실제 이웃만 방문) |
| 적합한 상황 | 간선이 매우 많은 밀집 그래프(Dense) | 정점이 많고 간선이 적은 희소 그래프(Sparse) |
해시 테이블(Hash Table)의 원리와 충돌(Collision) 해결 기법
dict, 자바 HashMap, JS Map/Object):"apple")를 해시 함수(Hash Function)에 넣어 정수형 해시 코드로 변환한 뒤, 배열 크기 으로 나눈 나머지()를 인덱스로 삼아 버킷(Bucket)에 값을 저장합니다.HashMap 채택 방식, 버킷에 8개 이상 쌓이면 트리로 전환하여 최악 보장).dict는 개방 주소법 계열 사용).1) k = 10 삽입: h(10) = 10 mod 7 = 3 ➔ 3번 버킷이 비어 있으므로 인덱스 [3]에 10 저장.
2) k = 15 삽입: h(15) = 15 mod 7 = 1 ➔ 1번 버킷이 비어 있으므로 인덱스 [1]에 15 저장.
3) k = 24 삽입: h(24) = 24 mod 7 = 3 ➔ 3번 버킷에 이미 10이 있어 충돌(Collision) 발생!
선형 탐사로 다음 칸인 (3 + 1) mod 7 = 4번 버킷을 확인하니 비어 있으므로 인덱스 [4]에 24 저장.
4) k = 31 삽입: h(31) = 31 mod 7 = 3 ➔ 3번(10 점유) 충돌 ➔ 4번(24 점유) 연속 충돌!
한 칸 더 이동한 5번 버킷이 비어 있으므로 인덱스 [5]에 31 저장.
최종 결과: 15는 [1], 10은 [3], 24는 [4], 31은 [5]번 인덱스에 저장됩니다.
적재율(Load Factor)과 리해싱(Rehashing) 실무 포인트
dict나 set에서 리스트(list)는 키로 쓸 수 없고 튜플(tuple)이나 문자열(str)만 키로 쓸 수 있습니다. 만약 키 객체의 내부 값이 저장 후 변경되면 해시값도 바뀌어 버려, 원래 저장했던 버킷 위치를 영영 찾을 수 없게 되기 때문입니다.핵심 요약
- ✓그래프 표현에서 인접 행렬은 두 정점의 연결 확인이 O(1)로 빠르고, 인접 리스트는 메모리 사용량이 O(V+E)로 효율적이다.
- ✓해시 테이블은 해시 함수를 통해 Key를 배열 인덱스로 직접 변환하여 평균 O(1)의 검색·삽입·삭제 속도를 제공한다.
- ✓해시 충돌 해결 기법으로는 연결 리스트를 활용하는 분리 연결법(Chaining)과 빈 버킷을 탐색하는 개방 주소법(Open Addressing)이 있다.
- ✓적재율(Load Factor)이 임계치를 넘으면 충돌을 줄이기 위해 테이블 크기를 확장하는 리해싱(Rehashing)이 수행된다.