해쉬 테이블 : "키", "데이터"를 저장함으로써 즉각적으로 데이터를 받아오고 업데이트 하고 싶을 때 사용하는 자료구조
해쉬함수 : 임의의 길이를 갖는 메시지를 입력하여 고정된 길이의 해쉬값을 출력하는함수입니다.
해쉬 테이블의 내부 구현은 키를 해쉬 함수를 통해 임의의 값으로 변경한 뒤 배열의 인덱스로 변환하여 해당하는 값에 데이터를 저장합니다.
만약, 해쉬 값 혹은 인덱스가 중복되어 충돌이 일어난다면? 체이닝과 개방주소법으로 해결.
items = [None]*8
hash("가") %86
hash("나")%8
5
items[hash("가") %8]="가위"
items[hash("나") %8]="나비"
결과 :: items[None, None, None, None, None, '나비', '가위', None]
items[hash("나") %8]'나비'
O(N)
인덱스 값이 동일했을때.. "충돌발생"
해결 1) 링크드 리스트 사용. >> 체이닝
해결 2) 배열의 다음 남는 공간에 넣는것. >> 개방주소법(Open Addressing)
class LinkedTuple:
def __init__(self):
self.items = list()
def add(self, key, value):
self.items.append((key,value))
def get(self, key):
for k,v in self.items:
if key == k:
return v
class LinkedDict:
def __init__(self):
self.items = []
for i in range(8):
self.items.append(LinkedTuple())
def put(self,key,value):
index = hash(key)%len(self.items)
#LinkedTuple
self.items[index].add(key,value)
def get(self,key):
index = hash(key) % len(self.items)
return self.items[index].get(key)
#hash("사") %8 >>1
#hash("다") %8 >>1
l = LinkedDict();
a ="바"
b ="자"
print(a,b,(hash(a) %8)==(hash(b) %8))
l.put(a,"사자")
l.put(b,"다리미")
print(l.get(a))
print(l.get(b))
'Algorithm' 카테고리의 다른 글
[1028알고리즘 FROM 동빈나 21]그래프 탐색 : DFS vs BFS (0) | 2021.04.13 |
---|---|
[1028알고리즘 20]Dynamic Programming (0) | 2021.04.10 |
[1028알고리즘 18]정렬 (0) | 2021.04.10 |
[1028알고리즘 17]재귀함수(Recursive function) (0) | 2021.04.10 |
[1028알고리즘 16]이진탐색 vs 순차탐색 (0) | 2021.04.10 |