"배열은 즉시 접근을 내주지. 단, 정수 인덱스를 알고 있을 때만. 해싱은 여기서 이렇게 물어. 이름이든 단어든 튜플이든, 어떤 키가 스스로 자기 인덱스가 될 수 있다면? 이 구조는 그 질문 하나에서 출발해."
꿈
배열의 arr[i]가 O(1)인 건 i가 주소를 바로 알려주기 때문이야. 그런데 실제로 다루는 키가 깔끔한 정수인 일은 거의 없지. 사용자명, 단어, ID, 좌표 같은 것들이잖아. "이 사용자명 이미 쓰였나?"를 리스트에서 찾으면 O(n)이고. 그럼 사용자명 자체를 배열 인덱스로 바꿔서 arr[i]처럼 그 슬롯으로 바로 뛸 수 있다면 어떨까? 해시맵이 주는 게 정확히 그거야.
트릭: 해시 함수
해시맵은 키를 처음부터 하나씩 훑는 대신 키를 해시 함수에 통과시켜 후보 위치를 계산해. 문자열 "pippa", 사용자 id 48291, 좌표 (37.5, 127.0) 같은 키가 해시값을 거쳐 테이블의 시작 위치를 얻는 거지. 그다음엔 실제 키가 같은지 비교하고, 충돌이 있으면 체인이나 다른 슬롯을 더 확인해. 이 과정의 기대 길이가 짧기 때문에 평균 O(1)이 나와.
속을 열어 보면 해시맵은 그냥 배열이야. 해싱은 아무 키나 그 배열의 정수 인덱스처럼 굴게 해주는 어댑터고. 배열 접근이 왜 즉시인지는 이미 알잖아. 배열과 문자열 트랙에서 본 주소 산술 말이야. 해싱은 그 선물을 정수에서 hashable한 모든 것으로 넓혀줄 뿐이야.
이미 매일 쓰고 있어
Python의 dict와 set이 해시맵이고, 아마 프로그래밍 전체를 통틀어 가장 많이 쓰이는 비자명한 자료구조일 거야. "이거 전에 봤나?"는 set, "이 키의 값이 뭐지?"는 dict, "각 단어가 몇 번 나왔지?"도 dict. 이 퀘스트 앞부분에서 O(n)짜리 in list를 O(1)짜리 in set으로 바꿀 때마다 그걸 즉시로 만들어 준 게 바로 이 기계장치야. 면접 대비로 외우는 별난 구조가 아니라 매일 손이 가는 일꾼이지.
피파의 고백
dict와 set이 제일 먼저 손이 가는 도구고, '이 조회를 O(n) 훑기 대신 O(1) 해시로 바꿀 수 있나?'는 반복문을 쓸 때마다 거의 자동으로 돌리는 반사신경이야.