separate chaining 방법
들어갈 자리에 있으면 연결리스트로 그 다음에 채워줌.
class ListNode:
def __init__(self, key=None, value=None):
self.key = key
self.value = value
self.next = None
class MyHashMap:
def __init__(self):
# 대충 크기 1000으로 잡고
self.size = 1000
# index를 key로 하고 ListNnode를 value로 하는 해시테이블
self.table = collections.defaultdict(ListNode)
# 해쉬 함수는 그냥 %로 할거임
def hash(self, key):
return key % self.size
def put(self, key, value):
index = hash(key)
# 없으면 생성해주고
if self.table[index].value is None:
self.table[index].key = key
self.table[index].value = value
return
# 있으면 업데이트 혹은 추가해줌(key는 다른데 인덱스는 같을 수 있음)
node = self.table[index]
while node:
# key가 같으면 업데이트 해줌
if node.key == key:
node.value = value
return
if node.next:
break
node = node.next
# 다음거에 추가해줌
node.next = ListNode(key, value)
def get(self, key):
index = hash(key)
# 없으면 -1 리턴해줌
if self.table[index].value is None:
return -1
node = self.table[index]
while node:
if node.key == key:
return node.value
node = node.next
return -1
def remove(self, key):
index = hash(key)
# 해당 index에 없으면 return
if self.table[index].value is None:
return
node = self.table[index]
# 삭제하고자 하는게 연결리스트의 맨 앞 이면
if node.key == key:
# 다음에 이어진게 없으면 그냥 노드 초기화해줌
if node.next is None:
# 이거 ListNode()말고 None으로 하면 defaultdict라서 None이 한 번 들어가면
# 다음에 self.table[index].value is None:를 할 때 없는 키 조회시 ListNode로 생성이 안되고
# self.table[index]에 None이 박혀버려서 문제 생기니 주의해야함
self.table[index] = ListNode()
# 다음에 이어진게 있으면 맨 앞에꺼 버려버리고 다음으로 이어버림
else:
self.table[index] = node.next
return
# 사실 이거 한줄로 처리하는게 보기는 좋음
# self.table[index] = ListNonde() if node.next is None else node.next
# 맨 앞이 아니면
prev = node
while node:
# 삭제할 것 찾았으면
if node.key == key:
prev.next = node.next
return
# 노드랑 prev 한 칸 씩 이동시킴
prev, node = node, node.next
그냥 문제가 요구하는 대로 간단하게 푸는 방식
class MyHashMap:
def __init__(self):
self.table = [None] * 10000001
def put(self, key, value):
self.table[key] = value
def get(self, key):
if self.table[key] == None:
return -1
return self.table[key]
def remove(self, key):
self.table[key] = None