해시 테이블(Hash table)
키를 해시 함수(hash function)로 칸 번호로 바꿔 곧바로 찾아가는 자료 구조. 평균(mean) O(1)에 찾지만, 충돌은 생일 문제(birthday problem)처럼 생각보다 일찍 일어난다.
이름으로 전화번호를 찾는 일을 생각해 봅시다. 이름을 정렬해 두고 이진 탐색(binary search)을 하면
칸 수
키의 가짓수는 칸 수보다 훨씬 많으니, 서로 다른 키가 같은 칸에 떨어지는 충돌은 피할 수 없습니다(비둘기집 원리, pigeonhole principle). 게다가 충돌은 생각보다 훨씬 일찍 일어납니다. 해시 함수가 키를 칸들에 고르게 흩뿌린다고 하면 이것은 바로 생일 문제입니다. 365칸이면 23개만 넣어도 충돌이 있을 확률(probability)이 절반을 넘습니다. 일반적으로 m칸이면 약
그래서 해시 테이블은 충돌을 막는 대신 감당합니다. 여기서는 같은 칸의 키들을 사슬로 이어 두는 체이닝(separate chaining)을 썼습니다. 키 n개가 m칸에 고르게 퍼지면 사슬의 평균 길이는 적재율(load factor)
'평균'이라는 말에 주의해야 합니다. 앞의 계산은 키들이 칸에 고르게 퍼진다는 가정 위에 서 있습니다. 해시 함수를 아는 사람이 한 칸에 몰리는 키만 골라 넣으면 이 가정이 무너져, 찾기 한 번에
이어지는 곳. 해시 테이블은 프로그래밍 언어가 제공하는 집합(set)과 사전 자료 구조의 바탕입니다. 해시 함수만 따로 쓰기도 합니다. 파일을 짧은 수 하나로 요약해 두었다가 다시 계산해 비교하면 파일이 바뀌었는지 알 수 있습니다(검사합, checksum). 결과로부터 입력을 되찾거나 같은 결과를 내는 다른 입력을 만들기가 현실적인 계산량으로는 불가능하도록 설계한 것이 암호학적 해시입니다. zip의 렘펠–지브 압축(Lempel–Ziv compression)은 앞에 나온 같은 문자열을 해시 테이블로 빨리 찾아냅니다. 두 집합의 공통 원소(element) 수를 합집합(union)의 원소 수로 나눈 값이 자카드 지수(Jaccard index)인데, 두 집합이 같은 해시값을 낼 확률이 바로 이 지수와 같아지도록 만든 해시(MinHash)로 수많은 문서 가운데 비슷한 것을 골라내기도 합니다.
이 개념이 나오는 긴 글
이 개념을 언급하는 페이지
- 생일 문제
… 되려면 약 1.18\sqrt N 개만 뽑으면 됩니다(N = 365이면 22.5개). 키를 칸에 흩어 담는해시 테이블에서 두 키가 같은 칸에 떨어지는 충돌이 생각보다 훨씬 일찍 일어나는 것도 이 때문입니다. 암호에서도 …
- 비둘기집 원리
… 모두에게 짝을 줄 수 있다는 것이 홀의 정리입니다. 컴퓨터에서도 자주 쓰입니다. 칸보다 키가 많으면해시 테이블의 충돌은 피할 수 없습니다. 비교를 k번 하는 정렬은 예/아니오 답의 줄이 많아야 2^k 가지라서, …
- 모듈러 연산
… 칸 수 m으로 나눈 나머지를 칸 번호로 쓰는 것은 가장 단순한 해시 함수입니다. 곧바로 칸을 찾아가는해시 테이블이 이렇게 만들어집니다.
- RSA 암호
… 붙이면, 누구나 공개된 e 로 풀어 보아 그 사람이 보냈음을 확인할 수 있습니다. 실제로는 긴 메시지를해시 함수로 짧은 고정 길이의 수로 줄인 뒤 그 수를 잠급니다. 서로 다른 메시지의 해시가 우연히 같아질 확률은 …
- 점근 표기법
… n) , 좋은 정렬의 O(n \log n) , 목록 크기와 상관없이 평균 일정한 걸음에 찾는해시 테이블의 O(1) 이 이 잣대로 비교됩니다. 조화급수가 \ln n + O(1) 이라는 사실은 퀵정렬의 평균 …
- 이진 탐색
… 드니, 여러 번 찾을 때에야 정렬에 한 번 투자할 만합니다. 순서는 필요 없고 같은 것만 찾으면 된다면해시 테이블이 평균 상수 번의 비교로 찾습니다. 간단해 보여도 정확하게 짜기는 의외로 까다롭습니다. 구간의 끝을 …
- 무작위 알고리즘
… 방법⟧에서 빌려 왔습니다. 둘 다 운에 따라 답이 조금 어긋날 수 있다는 점이 같습니다. 이어지는 곳.해시 테이블은 해시 함수를 무작위로 골라 일부러 만든 충돌 공격을 막고, 무작위 대조 시험은 처치를 무작위로 …
- 렘펠–지브 압축
… 자랍니다. 실제 압축기는 가장 긴 겹침을 빨리 찾으려고 세 글자짜리 조각마다 그것이 나왔던 자리들을해시 테이블에 적어 둡니다. 세 글자짜리 조각은 n = 3인 n-그램입니다. zip, gzip, PNG가 쓰는 …