💡해시 테이블
- 해시 테이블의 연산은 대부분 분할 상환 분석에 따라 시간 복잡도가 O(1)에 달하는 빠른 연산을 보장한다.
- 데이터 양에 큰 영향을 받지 않고 연산의 시간 복잡도가 동일하게 작다.
💡해시
- 해시 함수란 어떤 데이터든지 특정 고정 크기로 데이터를 변환할 수 있는 함수를 의미한다.
- 해시 함수는 주로 무작위화 함수, 손실 압축, 암호, 체크섬 같은 개념과 혼용되서 사용된다.
- 해시 함수는 주로 무작위화 함수, 손실 압축, 암호, 체크섬 같은 개념과 혼용되서 사용된다.
- 해싱이란 해시 함수를 활용한 데이터를 저장한 해시 테이블에서 빠르게 인덱싱 하는 작업을 의미한다.
- 해싱은 데이터를 가능한 빠르게 찾고 저장할 수 있는 기법으로 사용된다.
- 최적의 검색을 요구하는 기능에 해싱 기술이 사용된다.
- 좋은 해시 함수의 특징
- 해시 함수 값 충돌의 최소화
- 쉽고 빠른 연산
- 해시 테이블에 해시 값 균일하게 분포
- 사용할 키의 모든 정보를 활용하여 해싱 작업
- 함수 값 충돌 최소화에 대한 고찰
- 생일이 같은 사람이 2명 이상일 확률은 23명만 모여도 50%가 넘는다. 가능성 있는 생일이 365일이기 때문에 366명이 함께 있어서 같은 생일이 2명 이상일 확률이 50%가 넘을 것으로 생각하지만 생각 이상으로 중복이 많다.
- 증명 (10만번 테스트 가정)
import random
TRIALS - 100000
same_birthday = 0
for _ in range(TRIALS):
birthdays=[]
for i in range(23):
birthday=random.randint(1,365) # ==> 365일 중 random 값 추출
# 현재 birthdays 중에서 같은 숫자가 있으면 same_birthday 업데이트
if birthday in birthdays:
same_birthday += 1
break
# 기존 생일 중에 없다면 birthdays 업데이트
birthdays.append(birthday)
# 같은 생일이 나올 확률 출력
print("확률 : {}%".format(same_birthday / TRIALS * 100))
- 비둘기 집 원리
- 9개 있는 비둘기 집에 10마리 비둘기들이 온다면 충돌은 1번 일어날 것으로 기대할 수 있다.
- 하지만 처음 1마리가 들어간 곳으로 9마리 모두 들어가려다가 충돌이 일어날 수 있다. (중복 의미)
- 로드 팩터
- 해시 테이블에 저장된 데이터 개수(m)를 버킷의 개수만큼 나눈 것
- 로드 팩터 값을 통하여 해시 함수가 제 역할을 다하는지 확인할 수 있음
- 하지만 로드 팩터 값이 증가할 수록 해시 테이블의 성능은 더 감소한다.
- 충돌 에러
- 해시 함수가 아무리 정교해도 해싱 작업에서 동일한 결과로 충돌한다면, 개별 체이닝 기술을 활용하여 값을 연결리스로 연결 수 있다.
- 개별 체이닝 기술
- 키의 해시 값을 계산한다.
- 해시 값을 활용하여 배열의 인덱스를 구한다.
- 같은 인덱스가 있을 경우 연결 리스트로 연결한다. - 잘 구현할 경우 작업 시간 복잡도가 O(1)로 간단히 끝날 수 있지만 경우에 따라서는 모든 해시들이 충돌을 일으켜 O(n)이 될 수도 있다.
💡 로드 팩터
- 로드 팩터란 해시 테이블의 데이터 개수를 해시 테이블의 전체 버킷의 양으로 나눈 값을 의미
- 로드 팩터라는 개념을 기준으로 해시 테이블의 공간 재할당 및 크기 조정, 해시 함수 재작성 여부를 판단
- 보통 로드 팩터의 기본값은 0.75 정도로 잡고 있으며(Java 기준) 로드 팩터의 수치가 올라갈수록 해시 테이블의 성능은 감소
💡 해시 함수
- 해시 함수란 해시 테이블에 데이터를 인덱싱하기 위해 변환하는 함수를 의미
- 해당 해시 함수로 인덱싱하는 과정을 해싱이라고 부른다.
- 다양한 알고리즘이 있지만 기본적으로 나눗셈 방식을 의미하는 모듈로 연산으로 정수형 해싱 기법을 적용.
- 파이썬에서 모듈로 연산은 k % n 로 표기함
💡 해시 값 충돌 해결 방법
- 개별 체이닝
- 입력 값의 해시 값이 동일하여 충돌할 경우 기존 해시 값에 연결리스트로 연결하는 방식
- 해시 테이블 구조의 원형이기도 하며, 가장 전통적인 방식으로 인식
- 해시 테이블의 크기에 영향 받지 않으며, 무한적으로 저장할 수 있다.
- 작동 원리
- 해시 함수를 통해 해시값을 변환한 후 해당 값의 인덱스를 활용하여 값을 확인했을 때, 이미 값이 있다면, 연결 리스트로 연결
- 오픈 어드레싱
- 해시 값 충돌 발생 시 탐사를 통해 빈 공간을 찾아 배정하는 방식
- 해시 테이블 전체 공간 이상을 저장할 수 없다.
- 모든 데이터가 중복 없이 해시값과 일치하는 주소에 저장된다.
- 다양한 알고리즘 방식이 있지만 기본적으로 선형 탐사 방식이 있다
- 선형 탐사 방식은 충돌이 발생한 해당 위치부터 순차적으로 탐사하며 빈 공간을 찾는다.
- 전체적으로 간단하고 성능이 좋지만 예상할 수 있는 문제점으로는 충돌 발생한 공간부터 순차적으로 탐사하다 보니 해시값의 인덱스가 특정 공간에 몰릴 수 있는 우려가 있다. 이로 인해 클러스터링 현상이 발생하면서 해싱의 효율을 떨어뜨릴 수 있다.
'Develop > 자료구조' 카테고리의 다른 글
[자료구조] 우선순위 큐 구현 (0) | 2023.01.17 |
---|