13강 / 20강

해시 테이블 — 이름을 번호로 바꾸는 마법

딕셔너리와 집합이 그렇게 빠른 진짜 이유

해시 테이블 — 이름을 번호로 바꾸는 마법
해시 함수는 이름을 사물함 번호로 바꿔 주는 계산기입니다.

4강과 5강에서 이상한 일이 있었습니다. 100만 개짜리 집합에서도 in 검사가 즉시 끝났죠. 전부 훑지도 않았는데 어떻게 알았을까요?

비밀은 찾지 않기입니다. 대신 계산해서 자리를 알아냅니다.

🔑
열쇠
"민준"
🧮
해시 함수
이름 → 숫자
🗄️
칸 번호
3번 칸

사물함에 물건을 넣을 때 이름을 계산기에 넣어 나온 번호의 칸에 넣습니다. 찾을 때도 같은 계산을 하면 바로 그 칸이 나오죠. 훑을 필요가 없습니다.

이름 → 숫자. 이게 해시의 전부입니다.
Python 브라우저에서 실행

🎮 해시 테이블 실험실

이름을 넣으면 어느 칸에 들어가는지 계산 과정과 함께 보여 줍니다. 칸 수를 줄여서 충돌을 일부러 만들어 보세요.

해시 테이블 — 계산으로 자리를 정하고, 충돌을 직접 만들어 봅니다
불러오는 중…
파이썬 딕셔너리의 축소판. 칸 수를 2로 바꿔 충돌을 늘려 보세요.
Python 브라우저에서 실행

왜 열쇠가 '바뀌지 않는 값'이어야 할까요

5강의 그 규칙, 이제 이유를 알 수 있습니다. [1,2] 라는 리스트를 열쇠로 써서 3번 칸에 넣었다고 합시다. 그런데 누가 리스트를 [9,9] 로 바꿔 버리면? 이제 계산 결과가 7번 칸이 나옵니다. 물건은 3번 칸에 있는데 7번 칸을 찾게 되는 거예요. 영원히 못 찾습니다. 그래서 파이썬은 아예 바뀌는 값을 열쇠로 못 쓰게 막습니다.

좋은 해시 함수의 조건: 고르게 흩어 놓기.
Python 브라우저에서 실행
🤔 확인 문제
해시 테이블이 빠른 근본적인 이유는?
🤔 확인 문제
충돌(collision)이란?
🤔 확인 문제
"점수가 30점에서 50점 사이인 학생을 모두 찾기"에 알맞은 자료구조는?