4강과 5강에서 이상한 일이 있었습니다.
100만 개짜리 집합에서도 in 검사가 즉시 끝났죠.
전부 훑지도 않았는데 어떻게 알았을까요?
비밀은 찾지 않기입니다. 대신 계산해서 자리를 알아냅니다.
🔑
열쇠
"민준"
🧮
해시 함수
이름 → 숫자
🗄️
칸 번호
3번 칸
사물함에 물건을 넣을 때 이름을 계산기에 넣어 나온 번호의 칸에 넣습니다.
찾을 때도 같은 계산을 하면 바로 그 칸이 나오죠. 훑을 필요가 없습니다.
이름 → 숫자. 이게 해시의 전부입니다.
Python브라우저에서 실행
🎮 해시 테이블 실험실
이름을 넣으면 어느 칸에 들어가는지 계산 과정과 함께 보여 줍니다.
칸 수를 줄여서 충돌을 일부러 만들어 보세요.
해시 테이블 — 계산으로 자리를 정하고, 충돌을 직접 만들어 봅니다
불러오는 중…
파이썬 딕셔너리의 축소판. 칸 수를 2로 바꿔 충돌을 늘려 보세요.
Python브라우저에서 실행
왜 열쇠가 '바뀌지 않는 값'이어야 할까요
5강의 그 규칙, 이제 이유를 알 수 있습니다.
[1,2] 라는 리스트를 열쇠로 써서 3번 칸에 넣었다고 합시다.
그런데 누가 리스트를 [9,9] 로 바꿔 버리면?
이제 계산 결과가 7번 칸이 나옵니다. 물건은 3번 칸에 있는데 7번 칸을 찾게 되는 거예요.
영원히 못 찾습니다. 그래서 파이썬은 아예 바뀌는 값을 열쇠로 못 쓰게 막습니다.
좋은 해시 함수의 조건: 고르게 흩어 놓기.
Python브라우저에서 실행
🤔 확인 문제
해시 테이블이 빠른 근본적인 이유는?
해설 찾는 게 아니라 계산합니다. 열쇠 → 해시 함수 → 칸 번호. 그 칸을 바로 열면 끝이니 개수와 상관없이 빨라요.
🤔 확인 문제
충돌(collision)이란?
해설 칸 수는 유한하고 열쇠는 무한하니 충돌은 피할 수 없습니다. 그래서 그 칸에 연결 리스트를 매달거나(체이닝), 옆 칸을 쓰는(개방 주소법) 대비책이 필요해요.
🤔 확인 문제
"점수가 30점에서 50점 사이인 학생을 모두 찾기"에 알맞은 자료구조는?
해설 해시는 순서 개념이 아예 없어서 범위 검색을 못 합니다. 이진 탐색 트리는 30을 찾아 들어간 뒤 중위 순회로 쭉 읽으면 돼요. 빠르다고 항상 좋은 게 아닙니다.