일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Codeup
- 가상환경 설정하기
- codeup 알고리즘
- 자료구조 해시
- python 가상환경
- 가상환경 패키지
- 코드업 기초100
- 코드업 파이썬 기초
- 코드업 기초100제
- Vue.js
- Python
- 자료구조 링크드리스트
- 파이썬 가상환경
- 자료구조 해시테이블
- 코드업 기초100제 파이썬
- 코드업 파이썬 100제
- 해시테이블
- 코드업 기초100제 파이썬 답
- 코드업
- react
- codeup python 기초100제
- codeup 파이썬
- react state
- 자료구조
- Linked List
- 링크드리스트
- 코드업 파이썬
- python 가상환경 설정
- hash table
- codeup python
- Today
- Total
zuchive
해시테이블(Hash Table) 4 본문
https://zuha.tistory.com/entry/해시테이블HashTable3
해시테이블(Hash Table) 3
https://zuha.tistory.com/entry/해시테이블HashTable2 해시테이블(Hash Table) 2 https://zuha.tistory.com/entry/해시테이블HashTable1 해시 테이블 (Hash Table) 1 해시라는 기능을 확장한 여러 가지 함수들이..
zuha.tistory.com
6-1. Chaining 기법
해시 테이블 밖에 충돌이 일어났을 경우, 밖에 데이터를 저장할 수 있는 공간을 링크드 리스트로 만든 것.
6-2. Linear Probing 기법 (가장 많이 언급되는 기법)
해시 테이블 안에 충돌이 일어났을 경우, 안에 빈 공간에 충돌된 데이터를 저장하는 기법
- 폐쇄 해싱 또는 Close Hashing 기법 중 하나 : 해시 테이블 저장공간 안에서 충돌 문제를 해결하는 기법
- 충돌이 일어나면, 해당 Hash address의 다음 address부터 맨 처음 나오는 빈 공간에 저장하는 기법
( 저장공간 활용도를 높이기 위한 기법 )
빈 공간이 최초로 나타나는 시점의 주소에 데이터를 저장.
- 장점 : 해시 테이블의 빈 공간을 충돌된 데이터로 채움 -> 저장공간의 활용도를 높일 수 있다.
연습 3 : 이전 포스팅에 있는 해시 테이블 코드에 Linear Probing 기법으로 충돌 해결 코드를 추가해보기
1. 해시 함수 : key % 8
2. 해시 키 생성 : hash(data)
hash_table = list([0 for i in range(8)])
def get_key(data):
return hash(data)
def hash_function(key):
return key % 8
def save_data(data, value):
index_key = get_key(data)
hash_address = hash_function(index_key)
if hash_table[hash_address] != 0:
# hash_address는 인덱스번호. 주소 공간은 0번부터 시작해서 1씩 증가하면서 다른 주소 공간을 가리킬 수 있다.
for index in range(hash_address, len(hash_table)):
if hash_table[index] == 0:
hash_table[index] = [index_key, value]
return
# 데이터의 주소의 index_key가 동일한 index_key라고 한다면
elif hash_table[index][0] == index_key:
# hash_table에 index에 있는 1번은 value 값을 저장
hash_table[index][1] = value
return
else:
hash_table[hash_address] = [index_key, value]
def read_data(data):
index_key = get_key(data)
hash_address = hash_function(index_key)
if hash_table[hash_address] != 0:
# hash_address 위에서부터 순회
for index in range(hash_address, len(hash_table)):
# 데이터가 저장이 되어있지 않은 빈공간이면 None을 return
if hash_table[index] == 0:
return None
# 내가 원하는 key 라면 해당 데이터를 return
elif hash_table[index][0] == index_key:
return hash_table[index][1]
else:
return None
Linear Probing 기법은 테이블 해당 주소에 저장이 되어있을 때 해당 key 값을 가지고 판단한다.
충돌이 일어날 경우 동일한 주소에 해당하는 데이터라 할지라도 그다음 빈 슬롯에 저장을 하게 되고
데이터를 찾을 때에도 데이터가 있다고 해서 바로 꺼내오는 것이 아니라
key 값을 확인하고 key 값이 맞을 때까지, 빈 슬롯이 나타날 때까지 데이터를 계속 순회한다.
빈 슬롯이 나타난다는 것은 데이터가 저장된 적이 없다는 것이기 때문에 해당 데이터가 저장되지 않았음을 return 한다.
key 값이 매칭이 되는 곳을 찾게 되면 해당 데이터를 return 하게 된다.
print(hash('dk') % 8)
print(hash('da') % 8)
print(hash('dc') % 8)
save_data('dk', '01200123123')
save_data('da', '3333333333')
read_data('dc')
'코딩테스트 > 자료구조' 카테고리의 다른 글
트리(Tree) 1 (0) | 2022.09.07 |
---|---|
해시테이블(Hash Table) 5 (0) | 2022.09.06 |
해시테이블(Hash Table) 3 (0) | 2022.07.12 |
해시테이블(Hash Table) 2 (0) | 2022.07.11 |
해시 테이블 (Hash Table) 1 (0) | 2022.07.10 |