해시를 적용한 연락처
해시함수를 사용해서 변환한 값을 인덱스로 삼아 키-값을 저장해서 빠른 데이터 탐
색을 제공하는 자료구조
“함진아”라는 키에 해시함수를 적용하면 인덱스 2를 얻는다.
=> 몇번을 해봐도 “함진아”의 해시함수 적용값은 2가 된다.
=> 이름을 가지고 바로 연락처 위치를 알 수 있다.
=> 이름 자체로 인덱스를 구할 수 있다.
버킷
해시테이블
7.
해시함수(정의)
임의의 키를 해시테이블의인덱스로 변경해주는 함수
=> 해시 테이블의 크기가 N이라면 해시함수는 0 ~ (N-1)사이 값을 내야 함
=> 충돌을 최소화 할수록 좋은 해시함수
- “홍길동”과 “홍길서”는 다른 키 임
- 서로 다른 키에 대해 해시 함수가 동일한
인덱스를 반환할 경우 충돌이 발생
8.
해시함수(나눗셈 법)
h(x) =x mod k (x는 키, k는 소수)
- k로 나눈 나머지는 0 ~ k-1이므로 해시 테이블의 크기는 k
- k가 소수인 이유는 충돌을 줄이기 위함(소수가 아니면 k주기로 해시값 반복 됨)
결국엔 (k-1)이 됨
9.
해시함수(곱셈법, 정의)
- 나눗셈법은k가 소수여야 하므로, 테이블 크기가 커지면.. 큰 소수가 필요(어려움)
- 곱셈법은 소수를 활용하지 않고 황금비를 곱하는 방식
- h(x) = (((x * A) mod 1) * m) x는 키, A는 황금 비, m은 최대 버킷의 갯수
a b
해시함수(문자열 해싱, 해시함수설명)
a b c x f
0 1 2 … (n-1)
키(s)
테이블 크기
- p는 31 (홀수이면서 메르센 소수)
- 숫자가 금방커지므로 구현시 overflow가 발생할 수 있음
* 수정된 공식 사용
- a = 1, b = 2, c = 3, ….. z = 26로 숫자를 매칭해서 사용
해시 충돌이란?
서로 다른키에대해 해시 함수 결괏값이 같은 경우 “충돌”이 발생함
- 체이닝, 개방 주소법이 충돌을 처리하는 대표적인 방법
16.
해시충돌처리(체이닝)
- 충돌 발생시, 해당 버킷에 링크드리스트로 데이터를 연결 함.
-특정 버킷에 데이터가 N개인 경우, 원하는 값을 찾는데 O(N)이 걸릴수 있음
만약 N개 데이터가 충돌이 발생하
면 탐색 성능은 O(N)이 됨
실제로는 이를 좀 더 효율적으로 하는 방법
도 가능하나(선형+이진트리) 체이닝의 특
징을 설명하게 위해 간소화 함
17.
해시충돌처리(개방 주소법 -선형 탐사)
- 충돌 발생 시, 다른 빈 버킷을 찾아 충돌값을 삽입
- 최대한 기존 테이블을 사용하자는 방식(메모리를 아낄수 있음)
- k는 키, i는 충돌시 이동할 버킷 수, m은 버킷 사이즈
18.
해시충돌처리(개방 주소법 -이중해싱)
- 용어 그대로 해시 함수를 2개 사용(경우에 따라 N개까지 확장)
- 기존에 i를 더했던 선형탐사와 다르게 2번째 해시함수에 i를 곱하는 방식도 가능
* 이 때 클러스터를 줄이기 위해 m을 제곱수나 소수로 함
- k는 키, i는 임의의 수, h1은 첫번째 해시함수, h2는 두번째 해시함수, m은 테이블크기
19.
언제 해시를 활용해서문제를 풀어야 하나?
- 키-값 쌍으로 연관된 데이터가 존재하며, 해당 값에 대한 접근이 빈번한 경우
* 예를 들어 사전(단어를 검색해서 뜻을 찾음) 이나, 연락처(이름을 검색해서
번호를 찾음)
- 중복되지 않는 키를 사용하는 경우
* 예를 들어 학번이나 집주소(중복되지 않음)
20.
언제 해시를 활용해서문제를 풀어야 하나?(예시 1)
학생 정보 관리 시스템
학생들의 정보를 관리하는 시스템을 예로 들어보겠습니다.
학생의 ID를 키로, 성적을값으로 저장한다고 가정합니다.
ID- 점수 한개 ID- 점수 여러개
21.
언제 해시를 활용해서문제를 풀어야 하나?(예시 2)
문자열 내 문자 빈도수
문자열이 입력됩니다.
문자열의 각 문자의 개수를 확인하고 싶습니다.
22.
해시를 사용하지 말아야하는 경우
특정 키에 여러 가지 값을 매칭해야 하는 경우
키가 2개 저장되지 않고 이전 키에 대한 값이 변경됨