작성 맥락
이 글은 직접 학습하거나 구현하며 남긴 개인 기술 기록입니다. 참고 자료가 있는 경우 본문에 출처를 남기고, 틀린 부분을 발견하면 수정합니다.
탐색 (Search)
출제빈도: 중
빈출태그: 탐색의 종류, 시간 복잡도
탐색의 정의
- 데이터를 찾는 작업
- 내부 탐색과 외부 탐색으로 구분
- 내부 탐색: 주기억장치 사용, 적은 양을 빠르게 탐색
- 외부 탐색: 보조기억장치 함께 사용, 많은 양을 느리게 탐색
탐색의 유형 ⭐
- 선형 탐색: 순차적으로 비교
- 이분 탐색: 절반씩 나눠가며 탐색
- 보간 탐색: 찾을 값의 위치값을 예상해서 검색하는 사전식 탐색
- 블록 탐색: 대량의 데이터를 그룹별로 블록화, 인덱싱을 통해 탐색
- 이진 트리 탐색: 검색 대상 데이터를 이진 트리로 변형한 뒤 탐색
- 해싱 탐색: 해싱 함수를 사용해서 데이터를 검색
복잡도
공간 복잡도
- 사용되는 메모리의 크기
- 알고리즘의 품질에 영향을 미치는 비중이 낮음
- 메모리 용량과 관련됨
시간 복잡도
- 연산이 수행되는 횟수
- 환경에 따라 실행시간이 달라짐. 횟수가 정확한 기준이 됨
- 모든 연산이 다 반영되지는 않아서 정확하지 않지만 대략적인 횟수 산출
- 최악의 경우를 기준으로 산출
- 빅 오 표기법을 사용함
빅 오(O) 표기법
- O(1): 일정한 수행 횟수를 가짐. 데이터의 개수와 상관없이 고정된 횟수로 실행
- O(logN): 입력 데이터 수에 따라 연산 횟수가 늘어나는 폭이 점점 줄어듦. 이분탐색, 이진 트리 탐색에 이용
- O(N): 연산횟수가 일정하게 증가(비례). 수열 계산이나 순차 탐색에 활용
- O(NlogN): 입력 데이터 수에 따라 횟수가 늘어나는게 점점 커짐. 퀵 정렬, 힙 정렬, 병합 정렬에 사용
- O(N²): 데이터 수에 따라 연산 횟수가 데이터 수의 제곱만큼 필요. 버블 정렬, 선택 정렬에 사용
- O(2^N): 연산 횟수가 데이터 수의 지수승만큼 필요. 피보나치 수열 등의 재귀호출
- O(N!): 가장 느린 알고리즘. 연산 횟수가 입력 데이터 수의 팩토리얼
주요 탐색 알고리즘
선형 탐색
- 순차적으로 비교
- 데이터의 개수나 정렬 여부를 알지 못해도 사용 가능
- 단순비교, 데이터 수가 적을 때 활용
- 시간복잡도: O(N)
- 비교 횟수 평균: (N+1)/2
- 예시: 5개의 데이터 중 22를 탐색하는 경우
- 22가 1번째일 때: 1회 비교
- 22가 3번째일 때: 3회 비교
- 22가 N번째일 때: N회 비교
이분(Binary) 탐색
- 나눠진 데이터 그룹 중 대소 비교를 통해 다시 절반으로 나눔
- 데이터 개수 파악, 데이터 정렬 필요
- 중간으로 잘라서 중간값과의 대소 비교로 탐색
- 시작, 중간, 끝값 사용
- 시작 위치가 끝 위치보다 커지면 탐색 종료
- 예시: 정렬된 배열 [3, 7, 12, 18, 25, 30, 42]에서 25를 찾는 경우
- 시작(0)~끝(6) 중간은 인덱스 3(값 18). 25 > 18 이므로 오른쪽 절반만 남김
- 시작(4)~끝(6) 중간은 인덱스 5(값 30). 25 < 30 이므로 왼쪽 절반만 남김
- 시작(4)~끝(4) 중간은 인덱스 4(값 25). 일치 → 탐색 종료
- 선형 탐색이면 최악의 경우 7번 비교해야 할 데이터를 3번 만에 찾아낸 것 — 데이터가 많아질수록 이 차이(O(N) vs O(logN))는 극적으로 벌어진다.
해시(Hash) 탐색
- 해시 함수를 사용
- 시간복잡도: O(1)
- 함수를 통해 저장 위치가 충돌할 경우 조치 필요
주요 용어
- 홈 주소: 해시 테이블 내부 인덱스
- 키: 해싱 함수의 입력값이 되는 데이터
- 버킷: 슬롯들의 집합. 홈 주소에 여러 버킷 존재 가능
- 슬롯: 하나의 데이터를 저장할 수 있는 공간
- 해시 테이블: 다수의 홈 주소와 버킷으로 구성된 기억 공간
- 동의어(Synonym): 충돌이 일어난 슬롯의 집합
- 충돌(Collision): 서로 다른 슬롯이 같은 키를 가지는 현상
- 프로빙(Probing): 충돌 발생 시 다음 공간으로 이동
- 체인법(Chaining): 연결 리스트 형태로 같은 홈 주소 내에서 슬롯을 이어서 오버플로우 해결

해시 함수의 종류 ⭐
- 제산법(Division): 나눈 나머지값을 이용해 저장위치 결정
- 폴딩법(Folding): 부분별 숫자의 합연산, XOR 연산의 결과로 저장 위치 결정
- 제곱법(Square): 제곱한 결과의 일부분으로 저장 위치 결정
- 숫자 분석법(Digit Analysis): 숫자 분포가 고른 부분을 분석하여 저장위치 결정
- 기수 변환법(Radix Conversion): 키값을 다른 진법으로 변환하여 저장 위치 결정
- 무작위법(Random): 난수를 이용
해시 함수의 조건
- 충돌을 최소화할 수 있어야 함
- 복잡하지 않고 빠르게 처리될 수 있어야 함
핵심 정리
- 정렬 여부가 탐색 방법 선택의 갈림길이다 — 정렬 안 된 데이터는 선형 탐색(O(N))밖에 못 쓰지만, 정렬돼 있다면 이분 탐색(O(logN))으로 훨씬 빠르게 찾을 수 있다.
- 해시 탐색은 이론상 O(1)이지만 이는 “충돌이 없다는 가정” 하에서만 성립한다 — 실제로는 해시 함수 품질과 충돌 해결 방식(체이닝/프로빙)이 실질 성능을 좌우한다.
댓글이 보이지 않으면 GitHub에 로그인한 뒤 새로고침해 주세요. 공개 댓글은 로그인 상태에서 더 안정적으로 표시됩니다.