→ 키와 값을 보관하고 연결 리스트로 처리할 별도의 객체이다.
class LinkNode:
def __init__(self, value=None, key=None):
self.value = value
self.key = key
self.next = None
→ 초기화, 삽입, 조회, 삭제 기능이 있다.
초기화 구현
class MyHashMap:
def __init__(self):
self.size = 1000 # 해시테이블 사이즈 지정
self.table = collections.defaultdict(LinkNode) # defaultdict 생성
삽입 구현
→ 해싱 방법 중 정수형 모듈러를 사용한다. 이를 인덱스 값으로 참조한다.
def put(self, value, key):
# 해싱 모듈러 사용
index = key % self.size
→ 테이블에서 해당 인덱스값에 존재하지 않는경우 바로 노드를 생성한다.
if self.table[index].value is None:
self.table[index] = LinkNode(value, key)
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 = LinkNode(value, key)
조회 구현
→ 해당 인덱스가 비어있을 경우 -1을 출력
def get(self, key):
index = key % self.size
# 해당 인덱스의 table이 비어있으면 -1 출력
if self.table[index].value is None :
return -1
→ 다음 노드가 있을경우 일치할때까지 이동한다.
# 다음 노드가 있으면 키값과 일치할때까지 이동
while p :
# 일치하면 값 출력
if p.key == key :
return p.value
p = p.next
→ 일치하는 키가 없을 경우 -1 출력
# 키가 없으면 -1 출력
return -1
삭제 구현
→ 해당 인덱스 값이 없으면 아무것도 하지 않는다.
def remove(self, key):
index = key % self.size
# 해당 인덱스 값이 없으면 나띵
if self.table[index].value is None :
return
→ 인덱스에서 첫번째 노드일 경우 삭제.
# (1) 첫번째 인덱스일때 바로 삭제
p = self.table[index]
if p.key == key :
self.table[index] = LinkNode()
→ 첫번째가 아닌 다음 노드일 경우 삭제.
# (2) 연결리스트를 삭제할때
prev = p
while p :
# 일치하는 키를 찾으면 현재 노드를 끊고 다음 노드와 연결
if p.key == key :
prev.next = p.next
return
#
prev, p = p, p.next