일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- FastCampus
- 최단거리알고리즘
- 퀵정렬
- 코딩테스트
- 시나공정보처리기사
- 시간복잡도
- 내돈내산
- 코딩테스트대비
- 알고리즘
- Ai
- 자료구조
- BFS알고리즘
- 백준알고리즘2920번
- 작심삼개월
- 트리구조
- 환급챌린지
- 해쉬테이블
- 연결리스트
- DFS알고리즘
- nqueen
- 파이썬
- 프림알고리즘
- 크루스칼알고리즘
- 1주차완료
- Korean-NLP
- 패스트캠퍼스
- package-install
- AIFFEL
- 인강
- 코딩테스트인강
- Today
- Total
DevLog
[패스트캠퍼스 :: 코딩테스트 인강] 3주차 ① 해쉬 테이블 본문
알고리즘/기술면접 완전 정복 올인원 패키지 Online
17. 해쉬 테이블 - 1
18. 해쉬 테이블 - 2
19. 해쉬 테이블 - 3
내가 아는 해쉬라고는 해쉬 스완 아니면 해쉬 브라운인데 해쉬 테이블이라니...
그놈의 Hash가 뭔지 자주도 나오더라.. 자료구조가 아니라도
해쉬 테이블 자체의 개념은 이해하기 수월했는데, 구현하고 적용하는 것이 쉽지 않았다.
해쉬 테이블
1. 구조 : Hash Table: 키(Key)에 데이터(Value)를 저장하는 데이터 구조
-
Key를 통해 바로 데이터를 받아올 수 있으므로, 속도가 획기적으로 빨라짐
-
파이썬 딕셔너리(Dictionary) 타입이 해쉬 테이블의 예: Key를 가지고 바로 데이터(Value)를 꺼냄
-
보통 배열로 미리 Hash Table 사이즈만큼 생성 후에 사용 (공간과 탐색 시간을 맞바꾸는 기법)
-
단, 파이썬에서는 해쉬를 별도 구현할 이유가 없음 - 딕셔너리 타입을 사용하면 됨
2. 용어
-
해쉬(Hash): 임의 값을 고정 길이로 변환하는 것
-
해쉬 테이블(Hash Table): 키 값의 연산에 의해 직접 접근이 가능한 데이터 구조
-
해싱 함수(Hashing Function): Key에 대해 산술 연산을 이용해 데이터 위치를 찾을 수 있는 함수
-
해쉬 값(Hash Value) 또는 해쉬 주소(Hash Address): Key를 해싱 함수로 연산해서, 해쉬 값을 알아내고, 이를 기반으로 해쉬 테이블에서 해당 Key에 대한 데이터 위치를 일관성 있게 찾을 수 있음
-
슬롯(Slot): 한 개의 데이터를 저장할 수 있는 공간
-
저장할 데이터에 대해 Key를 추출할 수 있는 별도 함수도 존재할 수 있음
3. 장점/단점
-
장점
-
데이터 저장/읽기 속도가 빠르다. (검색 속도가 빠르다.)
-
해쉬는 키에 대한 데이터가 있는지(중복) 확인이 쉬움
- 앞서 학습했던 배열 구조에서 원하는 원소를 찾기 위해 원소의 처음부터 끝까지 반복적으로 모든 원소를 거쳐야 찾을 수 있는 비효율적인 단점을 보완할 수 있음
-
-
단점
-
일반적으로 저장공간이 좀더 많이 필요하다.
- 해쉬 함수를 거친 해쉬값의 범위가 실질적 원소의 수보다 많을 수 있기 때문에 저장 공간이 더 필요함
-
여러 키에 해당하는 주소가 동일할 경우 충돌을 해결하기 위한 별도 자료구조가 필요함
-
4. Chaining 기법
-
해쉬 테이블의 가장 큰 문제점은 해쉬의 값이 겹쳐 충돌(Collision)되는 경우이다.
-
충돌이 일어나면, 링크드 리스트라는 자료구조를 사용해서, 링크드 리스트로 데이터를 추가로 뒤에 연결시켜서 저장하는 기법
5. 코드
해쉬 구조는 파이썬에서 딕셔너리 타입을 활용하여 적용 가능하지만,
이해도를 높이기 위해 직접 구현한 코드이다.
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:
for index in range(len(hash_table[hash_address])):
if hash_table[hash_address][index][0] == index_key:
hash_table[hash_address][index][1] = value
return
hash_table[hash_address].append([index_key, value])
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:
for index in range(len(hash_table[hash_address])):
if hash_table[hash_address][index][0] == index_key:
return hash_table[hash_address][index][1]
return None
else:
return None
다음 시간에 이어서 남은 해쉬 테이블에 대하여 더 알아보고 관련된 문제를 찾아서 풀이해봐야겠다.
[패스트캠퍼스 100% 환급 챌린지 미션 중입니다.]
알고리즘 / 기술면접 완전 정복 올인원 패키지 Online. | 패스트캠퍼스
오직 개발자 취업을 위해 만든 알고리즘/기술면접 완벽 대비 강의
www.fastcampus.co.kr
'IT 개발 > Algorithm 알고리즘' 카테고리의 다른 글
[패스트캠퍼스 :: 코딩테스트 인강] 4주차 ① 트리 / 이진 트리 (0) | 2021.03.13 |
---|---|
[패스트캠퍼스 :: 코딩테스트 인강] 3주차 ② 해쉬 테이블 + 기초 문제풀이 (0) | 2021.03.05 |
[패스트캠퍼스 :: 코딩테스트 인강] 2주차 ② 연결리스트/더블 링크드리스트 (0) | 2021.02.28 |
[패스트캠퍼스 :: 코딩테스트 인강] 2주차 ① 연결리스트/링크드리스트 (0) | 2021.02.25 |
[패스트캠퍼스 :: 코딩테스트 인강] 1주차 ② 배열, 큐, 스택 (0) | 2021.02.21 |