728x90
체이닝(Chaining)을 이용한 해시 테이블(Hash Table) 구현
체이닝(Chaining)
- 해시 테이블에 두 값을 모두 저장할 수 있는 여러 방법 중 하나
- 해시 테이블의 특정 위치에서 하나의 키 를 저장하는 것이 아니라 하나의 연결 리스트 를 저장함.
- 새로 삽입된 키에 의해 충돌이 발생하면 리스트의 맨 뒤에 새로운 키를 추가함.
- 따라서 다수의 원소를 원하는 만큼 저장할 수 있음.
- 벡터 대신 연결 리스트를 사용하는 이유?
- 특정 위치의 원소를 빠르게 삭제하기 위함.
- 새로 삽입된 키에 의해 충돌이 발생하면 리스트의 맨 뒤에 새로운 키를 추가함.

코드
#include <iostream> #include <vector> #include <list> #include <algorithm> using uint = unsigned int; class hash_map { std::vector<std::list<int>> data; public: hash_map(size_t n) { data.resize(n); } void insert(uint value) { int n = data.size(); data[value % n].push_back(value); std::cout << value << "을(를) 삽입했습니다." << std::endl; } bool find(uint value) { int n = data.size(); auto& entries = data[value % n]; return std::find(entries.begin(), entries.end(), value) != entries.end(); } void erase(uint value) { int n = data.size(); auto& entries = data[value % n]; auto iter = std::find(entries.begin(), entries.end(), value); if (iter != entries.end()) { entries.erase(iter); std::cout << value << "을(를) 삭제했습니다." << std::endl; } } }; int main() { hash_map map(7); auto print = [&](int value) { if (map.find(value)) { std::cout <<"해시 맵에서 " << value << "을(를) 찾았습니다."; } else { std::cout << "해시 맵에서 " << value << "을(를) 찾지 못했습니다."; } std::cout << std::endl; }; map.insert(2); map.insert(25); map.insert(10); print(25); map.insert(100); map.insert(55); print(100); print(2); map.erase(2); return 0; }
결과
2을(를) 삽입했습니다. 25을(를) 삽입했습니다. 10을(를) 삽입했습니다. 해시 맵에서 25을(를) 찾았습니다. 100을(를) 삽입했습니다. 55을(를) 삽입했습니다. 해시 맵에서 100을(를) 찾았습니다. 해시 맵에서 2을(를) 찾았습니다. 2을(를) 삭제했습니다.
728x90
'Computer Science > Data Structure' 카테고리의 다른 글
[C++] 병합 정렬(Merge Sort) (0) | 2021.06.02 |
---|---|
[C++] 선형 탐색(Linear Search), 이진 탐색(Binary Search) (0) | 2021.05.29 |
[C++] 블룸 필터(Bloom Filter) (0) | 2021.05.28 |
[C++] 뻐꾸기 해싱(Cuckoo Hashing) (0) | 2021.05.22 |
[C++] 인접 리스트를 이용하여 그래프 구현하기 (0) | 2021.05.19 |
[C++] 인접 행렬을 이용하여 그래프 구현하기 (0) | 2021.05.19 |
[C++] 이진 탐색 트리(Binary Search Tree) (0) | 2021.05.16 |
[C++] 트리 순회(Tree Traversal) (0) | 2021.05.15 |