프로그래밍 기초 · 해시와 캐시: 공간으로 시간을 사다

해시 테이블: 찾기가 말도 안 되게 빠른 이유

첫 레슨의 복선, 기억나나요? 「회원 명단 조회」 버전 B는 set.has(user) 한 줄이었고, 명단이 100명에서 1000만 명으로 늘어나도 시간은 꿈쩍도 안 했어요. 다섯 번째 레슨에서 까발리기로 했죠—오늘은 그 「바로 도달」 마술을 분해해요: 훑지 않아요, 계산해요.

까발리기 · 훑지 않고 계산해요

수납 비유로 돌아가면: 큰 서랍에서 찾으려면 하나씩 뒤지는 건 어디에 있는지 모르기 때문이에요. 해시 테이블은 완전히 반대로—넣는 순간 고정 공식으로 몇 번 버킷에 둘지 계산하고, 찾을 때도 같은 공식을 다시 돌려 그 버킷을 바로 열어요. 그 공식이 해시 함수, 「위치 공식」이에요: 훑지 않고 한 번에 어디인지 알아요.

직접 해보기 · key를 버킷에 직접 넣어 보세요

아래는 0~7번 버킷 8개와, 들어갈 이름 6개예요. 이름을 하나 눌러 세 단계로 들어가는 걸 보세요: 글자마다 컴퓨터 코드로 바꿔 합하고, 8로 나눈 나머지(버킷이 8개뿐이라서), 계산된 버킷으로 날아가요. 눈여겨보세요: 「하나씩 비교」는 없고, 위치는 전부 계산이에요.

해시 함수(위치 공식): 이름 → 숫자 → 8로 나눈 나머지 = 버킷 번호
 
 
 
위 이름을 눌러 시작 · 각 이름은 한 번만 들어가요
찾을 때도 왜 빠른가요? 찾기와 넣기가 같은 공식이거든요. 「丽丽 있어?」라고 물으면 해시 테이블은 명단을 안 훑고 바로 다시 계산해요: 丽丽 → 40058 → 8로 나눈 나머지 = 2번 버킷, 2번을 바로 열어요. 6명이든 600만 명이든 같아요—식의 시간은 인원과 무관해요. 「말도 안 되게 빠르다」의 비밀이 전부예요.
예상 밖 · 두 이름이 같은 버킷에

이미 눈치챘을 수도 있어요: 阿芳과 丽丽가 둘 다 2번 버킷이에요! 이게 해시 충돌—버킷은 8개, 이름은 천만 가지, 충돌은 언젠가 나요. 가장 흔한 해결은 귀엽도록 단순해요: 버킷 안에 작은 연결 리스트로 달고, 나중에 온 건 체인에 줄 세워요(용어: 「체이닝」). 아래 버튼 세 개를 순서대로 누르고, 눈여겨보세요 찾을 때 몇 번 뒤지는지.

 
 
충돌해도 뒤진 건 2번뿐. 2번 버킷에 바로 도달(훑기 아님), 체인에서 阿芳(1번), 그다음 丽丽(2번)—이름 6개를 다 훑는 것보다 훨씬 빨라요. 버킷이 너무 적고 체인이 길어지면 해시 테이블이 스스로 버킷을 늘리고 재배치(확장)해요: 예) 8→16 버킷, 새 공식으로 모든 이름 위치를 다시 계산해 체인을 짧게. 이게 「공간으로 시간을 사다」—버킷을 조금 더 쓰고 바로 도달 속도를 되사요.
최종 대결 · 처음부터 훑기 vs 바로 도달

이제 데이터량을 키워 두 찾기 방식을 정면 레이스해요. 크기를 고르고 출발을 누르세요. 눈여겨보세요 오른쪽 카운터: 왼쪽이 아무리 오래 훑어도 항상 1~2번에 멈춰요.

데이터량:
🗄 처음부터 훑기(선형 탐색)
탐색 0
 
🗃 바로 도달(해시 탐색)
탐색 0
 
애니메이션은 비율로 늦춘 거예요—실제 격차는 더 커요
AI 세계에서의 진짜 모습

해시 테이블은 매일 당신을 가장 많이 섬기는 구조일지도 몰라요—다만 늘 무대 뒤에 있어요. 아래 네 장면 모두 「위치를 계산해 한 번에 바로 도달」 한 수예요.

🧰

Set과 딕셔너리

첫 레슨 버전 B의 Set, Python dict, JS Map—언어에서 「key로 값 꺼내기」 컨테이너는 속이 전부 해시 테이블이에요.

🔑

캐시 키

캐시는 「이 문제 계산해 봤나」를 밀리초 안에 답해야 해요—질문을 해시해 key로 바로 조회하죠. 다음 레슨의 주인공이에요.

🧹

중복 제거

학습 말뭉치 중복 제거, 크롤러의 「이 페이지 긁었나」—내용을 해시해 Set에 넣어 조회해요. 안 그러면 억 단위를 쌍쌍 비교하다 우주 열사까지 가요.

🎫

session 조회

ChatGPT를 열 때마다 서버는 session id로 수천만 온라인 사용자 가운데 당신 대화를 순식간에 찾아요—명단을 훑는 게 아니에요.

이 강의가 전하고 싶은 것