lenalog
로그인
lenalog
로그인
[TIL] Hash Table
lena_log
·
2022년 4월 11일
팔로우
1
Codestates Section5
목록 보기
9/10
해시테이블
해시테이블은 키를 활용해 값에 직접 접근이 가능한 구조
해싱의 목적: 검색(즉, 해시테이블은 검색알고리즘 역할도 한다)
해싱의 장점: 데이터 양에 영향을 덜 받으며 성능이 빠름
해시테이블은 검색 역할, 딕셔너리를 위한 자료구조 역할도 함
해시함수는 여러 키를 분할하기 위해 키를 해시값(정수값)으로 매칭시키는 역할
해싱은 쉽게 말해서 다 흩뜨려놓고 키와 매칭되는 값을 검색하는 과정
해시함수
입력값의 형태는 다양하고 출력값의 형태는 숫자
해시함수 조건
해시함수는 입력값이 같다면 동일한 출력값을 받아야함
해시함수는 특정 범위안에 있는 숫자를 반환해야함
하나의 해시함수가 입력 데이터별로 다른 숫자와 매핑된다면 그것은 완벽한 해시함수
해시함수가 입력데이터에 따라 다른 숫자를 반환하게 되면 해시충돌을 최소화
입력값: 문자열, 출력값: 정수형
정수형에서 문자열로 변환하기 위해서, 해시함수는 문자열에 해당하는 개별적인 단어를 활용
해시충돌
해시충돌은 키가 들어갈 자기가 없는 경우에 발생
체이닝, Chaining
해시 테이블에서 동일한 해시값에 대해 충돌이 일어나면, 그 위치에 있던 버킷에 키값을 뒤이어 연결
데이터 형태는 연결리스트의 형태
체이닝의 원리
키의 해시값 계산
해시값을 이용해 리스트의 인덱스를 구함
같은 해시값이 있다면(충돌한다면) 리스트로 연결
충돌을 줄이기 위해 각 리스트에 대해 연결(리스트형태)하도록 한다
(따라서, 충동 발생해도 체이닝을 통해 값을 찾을 수 있음)
체이닝으로 충돌상황을 재현하고 해결하는 모습을 구현할 수 있음
체이닝은 연결리스트의 원리를 사용해서 해시값이 같은 노드를 연결하는 모습을 가짐
해시값은 인덱스 역할도 함
오픈어드레싱, open addressing
다른 로직의 함수를 활용하기때문에 open address
비어있는 배열 슬롯이 발견될 때까지 array의 위치를 검색하여 해시 충돌을 해결
충돌이 일어나는 경우, 탐사를 진행하면서 빈공간을 찾아야 해결
(체이닝과 달리 저장공간 정해짐)
해시테이블로 구현된 자료형은?=>딕셔너리
체이닝의 경우 연결리스트를 활용하고 오픈 어드레싱은 내부적으로 공간이 어느정도 정해진 배열을 활용하여 설계됨
파이썬의 경우 내부적으로 오픈 어드레싱 방식을 활용
오픈 어드레싱 활용할때 빈 공간이 없으면 시간이 오래 걸릴 수 있어서 로드팩터를 작게 설정하여 성능 저하 문제를 해결
로드 팩터 비율에 따라 해시함수 재작성여부, 해시테이블 크기조정여부가 결정됨
놓은 해시함수란
키, 값 계산과정이 쉬워야함
충돌을 피할 수 있어야함
lena_log
안녕하세요. 기억보다 기록을 믿는 레나입니다!
팔로우
이전 포스트
[TIL] 분할 정복, 퀵 정렬, 병합 정렬
다음 포스트
[TIL] 자료구조와 그래프
0개의 댓글
댓글 작성