대량의 정보를 저장하고 특정 요소를 효율적으로 검색할 수 있는 복잡함 데이터 구조로, 테이블 내에 더 작은 서브 그룹인 버킷-배열(bucket)에 key(hash-index) - value를 한쌍으로 저장한다.
일반적으로 modular연산을 이용한다.
key mod m 일 때, m이 해시 테이블 크기이다.
해시 테이블에 저장된 데이터 개수 n을 버킷의 개수 k로 나눈 것이다.
loadFactor = n / k
Separate Chaining
Open Addressing (세가지 방법이 있다.)
a. Linear Probing (선형 탐사)
b. Quadratic Probing
c. Double Hashing Probing
import collections
class ListNode:
def __init__(self, key=None, value=None):
self.key = key
self.value = value
self.next = None
class MyHashMap:
# 초기화
def __init__(self):
self.size = 1000
self.table = collections.defaultdict(ListNode)
# 삽입
def put(self, key: int, value: int) -> None:
index = key % self.size
# 인덱스에 노드가 없다면 삽입후 종료
if self.table[index].value is None:
self.table[index] = ListNode(key, value)
return
# 인덱스에 노드가 존재하는 경우 연결리스트로 처리
p = self.table[index]
while p:
if p.key == key:
p.value = value
return
if p.next is None:
break
p = p.next
p.next = ListNode(key, value)
def get(self, key: int) -> int:
index = key % self.size
if self.table[index].value is None:
return -1
# 노드가 존재할때 일치하는 키 탐색
p = self.table[index]
while p:
if p.key == key:
return p.value
p = p.next
return -1
def remove(self, key: int) -> None:
index = key % self.size
if self.table[index].value is None:
return
# 인덕스의 첫번째 노드일때 삭제 처리
p = self.table[index]
if p.key == key:
self.table[index] = ListNode() if p.next is None else p.next
return
# 연결 리스트 노드 삭제
prev = p
while p:
if p.key == key:
prev.next = p.next
return
prev, p = p, p.next