
해시 테이블(Hash Table)은 효율적인 데이터 저장 및 검색을 제공하는 데이터 구조입니다. 키-값(Key-Value) 쌍을 저장하며, 해시 함수를 통해 키를 특정 위치(인덱스)로 매핑합니다.
해시 테이블은 키(Key)와 값(Value) 쌍을 저장하며, 데이터를 빠르게 검색, 삽입, 삭제할 수 있는 데이터 구조입니다.
핵심은 해시 함수를 사용해 키를 고유한 인덱스로 변환하여 데이터를 배열처럼 관리한다는 점입니다.
해시 함수는 입력된 키를 고정된 크기의 숫자(해시값)로 변환하는 함수입니다.
def simple_hash(key, table_size):
return sum(ord(char) for char in key) % table_size
해시 함수가 다른 키에 대해 같은 해시값을 반환하면 충돌이 발생합니다.
이를 해결하기 위해 다음과 같은 방법을 사용합니다.
| 충돌 해결 방법 | 설명 |
|---|---|
| 체이닝(Chaining) | 같은 인덱스에 여러 값을 저장하기 위해 링크드 리스트를 사용. |
| 개방 주소법(Open Addressing) | 충돌이 발생하면 다른 빈 공간을 찾아 데이터를 저장. 탐사 방법: 선형, 이차, 이중 해싱. |
체이닝 예시:
개방 주소법 예시:
| 연산 | 평균 시간 복잡도 | 최악 시간 복잡도 |
|---|---|---|
| 검색(Search) | O(1) | O(n) |
| 삽입(Insertion) | O(1) | O(n) |
| 삭제(Deletion) | O(1) | O(n) |
| 장점 | 단점 |
|---|---|
| 빠른 데이터 접근(O(1)의 평균 성능) | 충돌 발생 가능성 |
| 키-값 저장 방식으로 직관적인 데이터 관리 가능 | 해시 함수가 비효율적이면 성능 저하 발생 |
| 데이터베이스, 캐시 등 다양한 응용 분야에서 사용 가능 | 테이블 크기 조정(리사이징)이 비용이 큼 |
class HashTable:
def __init__(self, size):
self.size = size
self.table = [[] for _ in range(size)]
def hash_function(self, key):
return sum(ord(char) for char in key) % self.size
def insert(self, key, value):
index = self.hash_function(key)
# 동일한 키 처리
for pair in self.table[index]:
if pair[0] == key:
pair[1] = value
return
# 새 키 추가
self.table[index].append([key, value])
def search(self, key):
index = self.hash_function(key)
for pair in self.table[index]:
if pair[0] == key:
return pair[1]
return None
def delete(self, key):
index = self.hash_function(key)
for i, pair in enumerate(self.table[index]):
if pair[0] == key:
self.table[index].pop(i)
return True
return False
# 해시 테이블 사용 예시
hash_table = HashTable(10)
hash_table.insert("apple", 100)
hash_table.insert("banana", 200)
print(hash_table.search("apple")) # 출력: 100
hash_table.delete("apple")
print(hash_table.search("apple")) # 출력: None