자 서른 일곱 번째 키워드인 해싱테이블을 알아 볼 것이다.
이전에 해시코드를 알아보면서 조금 알아보았다. 이번엔 해싱테이블이 뭔지,
해싱테이블안에서 다른 개념과 충돌, 처리과정을 상세하게 알아보았다.

해싱 테이블(Hash Table)은 컴퓨터 과학에서 널리 사용되는 자료구조로, 데이터를 키-값(Key-Value) 쌍으로 저장하고 빠르게 검색할 수 있도록 설계되었다고 한다.
해싱 테이블은 해시 함수(Hash Function)를 사용하여 키를 해시 값(Hash Value)으로 변환하고, 이 해시 값을 인덱스로 사용하여 데이터를 배열 또는 리스트와 같은 버킷(Bucket)에 저장한다.
해시 함수(Hash Function)
버킷(Bucket)
충돌(Collision)
장점
단점
데이터 삽입: 키를 해시 함수에 넣어 해시 값을 계산합니다. 이 해시 값을 인덱스로 하여 버킷에 데이터를 저장한다.
데이터 검색: 검색할 키를 해시 함수에 넣어 해시 값을 계산하고, 이 해시 값을 인덱스로 하여 해당 버킷에서 데이터를 검색한다.
데이터 삭제: 삭제할 키를 해시 함수에 넣어 해시 값을 계산하고, 이 해시 값을 인덱스로 하여 해당 버킷에서 데이터를 삭제한다.
해싱 테이블은 데이터베이스 인덱싱, 캐시 구현, 집합(Set) 연산 등 다양한 분야에서 사용된다고 한다.
예를 들어, 데이터베이스에서 특정 값을 빠르게 검색하기 위해 해싱 테이블을 사용할 수 있다.
Direct Address Table(DAT)은 해싱 테이블의 특별한 형태로, 키가 직접 배열의 인덱스가 되는 구조이다.
이 방식은 해싱 테이블의 기본 개념을 더욱 단순화하여 구현한 것으로, 특정한 조건에서 매우 효율적일 수 있다.
직접 주소 매핑(Direct Address Mapping)
배열(Array)
장점
단점
데이터 삽입: 키를 배열의 인덱스로 사용하여 데이터를 삽입한다.
데이터 검색: 키를 배열의 인덱스로 사용하여 데이터를 검색한다.
데이터 삭제: 키를 배열의 인덱스로 사용하여 데이터를 삭제한다.
DAT는 키의 범위가 작고 예측 가능한 경우에 유용하다고 한다. 예를 들어, 학생의 성적을 저장할 때 학생 ID가 1부터 1000까지 연속적으로 부여된 경우에 DAT를 사용할 수 있다.
해싱 테이블에서 충돌(Collision)은 두 개 이상의 키가 같은 해시 값을 갖게 되는 경우를 말한다.
이는 해시 함수의 특성상 불가피하게 발생할 수 있다. 해싱 테이블은 효율적으로 데이터를 저장하고 검색할 수 있는 자료구조지만, 충돌이 발생하면 성능이 저하될 수 있다.
충돌은 해시 함수가 무한한 키 공간을 유한한 해시 값 공간으로 매핑하기 때문에 발생한다.
해시 함수가 키를 배열의 인덱스로 변환할 때, 서로 다른 키가 동일한 해시 값을 가질 수 있다.
상황 1 - 동일한 해시 값을 갖는 서로 다른 키
예를 들어, 문자열 "apple"과 "grape"가 같은 해시 값을 가질 수 있다. 해시 함수가 문자열의 길이를 기반으로 해시 값을 생성한다고 가정한다면, 문자열의 길이가 5인 "apple"과 "grape"는 동일한 해시 값을 가질 수 있다.
상황 2 - 해시 테이블이 가득 찬 경우
해시 테이블이 가득 차서 모든 버킷이 이미 사용 중인 경우에도 충돌이 발생할 수 있다. 이 경우 새로운 키를 저장할 위치를 찾는 과정에서 충돌이 발생한다.
해싱 테이블에서 충돌은 불가피하게 발생할 수 있다. 이를 해결하기 위해 여러 기법이 사용된다.
대표적인 충돌 해결 방법으로는 체이닝(Chaining)과 개방 주소법(Open Addressing)이 있다.
각 방법은 충돌을 효과적으로 처리하는데 서로 다른 접근 방식을 취한다.
체이닝은 각 버킷에 연결 리스트(Linked List)를 두어, 충돌이 발생한 데이터를 리스트에 저장하는 방법이다. 즉, 동일한 해시 값을 가진 키들이 하나의 버킷에 체이닝으로 연결된다고 한다.
개방 주소법은 충돌이 발생하면 다른 빈 버킷을 찾아 데이터를 저장하는 방법이다. 주요 기법으로는 선형 탐사(Linear Probing), 이차 탐사(Quadratic Probing), 이중 해싱(Double Hashing) 등이 있다.
장점
해시 테이블의 크기에 비해 많은 데이터를 저장할 수 있다.
데이터의 삽입, 삭제가 용이하다.
단점
연결 리스트를 위한 추가 메모리가 필요하다.
해시 값의 분포가 불균형할 경우, 특정 버킷에 많은 데이터가 몰릴 수 있다.
장점
메모리 사용량이 적다.
모든 데이터가 해시 테이블 내에 저장되므로, 추가적인 메모리 구조가 필요 없다.
단점
해시 테이블이 꽉 찰 수 있으며, 이 경우 성능이 급격히 저하될 수 있다.
클러스터링 문제가 발생할 수 있다.(특히 선형 탐사)
이번 키워드 같은 경우는 워낙 방대해서 양이 많아졌다.
확실히 자료구조에 대해서는 정보도 많지만 이해하기 어려운 내용이라 많은 자료를 찾아보았다.
C#에서 사용한 Dictionay가 생각나는데 해시테이블은 앞으로 중요하게 다룰 것 같으니
예제도 연습하며 익혀야 겠다.