이진 탐색(Binary search)
정렬된 목록에서 가운데를 보고 절반을 버리기를 되풀이해 찾는 방법. 백만 개 중 하나도 많아야 스무 번 비교하면 찾는다(log₂ n).
사전에서 낱말을 찾을 때 첫 쪽부터 넘기는 사람은 없습니다. 아무 데나 펼쳐서 찾는 낱말이 그보다 앞인지 뒤인지 보고, 한쪽을 통째로 버립니다. 이진 탐색은 이것을 가장 규칙적으로 한 것입니다. 정렬된 목록의 한가운데 값과 찾는 값을 비교하고, 찾는 값이 있을 수 없는 절반을 버리기를 되풀이합니다.
아래는 크기순으로 늘어놓은 31개의 수입니다. 찾는 수는
처음부터 하나씩 보는 순차 탐색이었다면
여기서 비교 한 번은 가운데 값과 견주어 '같다, 작다, 크다'를 한꺼번에 가리는 것으로 셉니다. 비교 한 번에 남은 후보가 절반 이하로 줄어드니, n개가 하나가 되기까지는
'같다'로 끝나는 마지막 한 번을 빼면, 비교 한 번의 답은 '앞' 아니면 '뒤', 곧 1비트입니다. 그래서 이진 탐색은 찾는 자리의 번호를 이진수로 한 자리씩 알아내는 것과 같습니다. 거꾸로, n개 가운데 하나를 가리키려면 적어도
이진 탐색의 조건은 목록이 먼저 정렬되어 있어야 한다는 것입니다. 정렬에는 이진 탐색보다 훨씬 많은 일이 드니, 여러 번 찾을 때에야 정렬에 한 번 투자할 만합니다. 순서는 필요 없고 같은 것만 찾으면 된다면 해시 테이블(hash table)이 평균(mean) 상수 번의 비교로 찾습니다.
간단해 보여도 정확하게 짜기는 의외로 까다롭습니다. 구간의 끝을 포함하는지, 가운데를 어느 쪽으로 반올림하는지, 찾는 값이 없을 때 어떻게 멈추는지에서 실수가 잦습니다. 가운데를
이어지는 곳. 같은 생각을 연속함수에 쓰면 중간값 정리(intermediate value theorem)에 기댄 이분법(bisection method)이 됩니다. 부호가 바뀌는 구간을 반씩 잘라 근을 찾는 것으로, 한 번에 한 비트씩 정확해집니다. 뉴턴 방법(Newton's method)은 접선(tangent line)을 써서, 근에서 기울기(slope)가 0이 아니면 근에 충분히 가까워진 뒤로 맞는 자릿수를 매번 두 배쯤으로 늘립니다. 문제를 반으로 줄여 한쪽만 푸는 이진 탐색은 분할 정복(divide and conquer)의 가장 단순한 경우입니다. 이 생각을 자료 구조로 굳힌 것이 이진 탐색 트리(tree)로, 각 점의 왼쪽 가지에는 그보다 작은 값만, 오른쪽 가지에는 큰 값만 두어 뿌리에서부터 이진 탐색하듯 내려가며 찾습니다. 다만 트리가 한쪽으로 기울면 목록과 다를 바 없어지므로, 균형을 유지해야
이 개념이 나오는 긴 글
이 개념 위에 세워진 것
이 개념을 언급하는 페이지
- 중간값 정리
… 이분법은 연속함수에서 부호가 다른 두 점만 있으면 절대 실패하지 않습니다. 정렬된 목록에서 값을 찾는이진 탐색도 같은 방법이라, 백만 개 가운데서도 스무 번 안팎이면 찾습니다( 2^{20} \approx 10^6 …
- 자연로그
… 일로 바뀌었습니다. 로그는 느리게 자라는 것들의 속도계입니다. 정렬된 목록 백만 개에서 절반씩 버리며 찾는이진 탐색은 \log_2 10^6 \approx 20 번이면 끝납니다. 조화급수 1 + \tfrac12 + …
- 정보 엔트로피
… 적어도 그만큼 비교해야 합니다(비교 정렬의 하한). 예/아니오 질문 하나로 후보를 절반씩 줄이는이진 탐색은 이 한계에 꼭 맞는 방법입니다.
- 알고리즘
… 알고리즘⟧입니다. 가장 많이 연구된 과제는 목록을 크기순으로 늘어놓는 정렬과 목록에서 원하는 것을 찾는탐색입니다. 알고리즘이 모든 입력에서 맞는 답을 내고 끝난다는 것은 몇 가지 입력을 시험해서는 보일 수 없고, …
- 점근 표기법
… n \ln n - n + O(\ln n) 도 같은 말투입니다. 알고리즘에서는 찾는 범위를 반씩 줄이는이진 탐색의 O(\log n) , 좋은 정렬의 O(n \log n) , 목록 크기와 상관없이 평균 일정한 걸음에 …
- 분할 정복
… 계수를 수치로 어림하는 일, JPEG 압축에 쓰이는 이산 코사인 변환을 빠르게 계산할 수 있습니다.이진 탐색: 반쪽 하나만 남기고 나머지를 버리는, a = 1, d = 0인 경우입니다. 동적 계획법: 하위 …
- 정렬 알고리즘
… 목록을 크기순으로 늘어놓는 일입니다. 컴퓨터가 하는 일 가운데 가장 흔한 것 중 하나이고, 정렬해 두면이진 탐색으로 빨리 찾고, 같은 것끼리 모으고, 중앙값을 바로 읽을 수 있습니다. 방법은 수십 가지이지만, 두 …
- 비교 정렬의 하한
… 중 하나를 가려내려면 \log_2 n! 비트의 정보가 필요한데, 한 번의 비교는 많아야 1비트를 줍니다.이진 탐색이 최악의 경우 \log_2 n 번보다 빠를 수 없는 것도, 원래 자료를 한 비트도 잃지 않고 되살릴 수 …
- 해시 테이블
이름으로 전화번호를 찾는 일을 생각해 봅시다. 이름을 정렬해 두고이진 탐색을 하면 \log_2 n 번쯤 비교해야 하지만, 해시 테이블은 n이 아무리 커도 평균 한두 번이면 …
- 트리
… 많습니다. 각 점의 왼쪽 가지에는 그보다 작은 값만, 오른쪽 가지에는 큰 값만 두는 이진 탐색 트리는이진 탐색을 자료 구조로 옮긴 것입니다. 부모가 늘 자식보다 작도록 쌓은 힙은 가장 작은 값을 늘 뿌리에 두어 …
- 결합 엔트로피와 조건부 엔트로피
… 않는 상태를 관측으로부터 추정할 때 이 조건부 구조를 그대로 씁니다. 질문 하나로 후보를 절반으로 줄이는이진 탐색은 스무고개 그대로이고, 허프만 부호의 나무는 갈림길 하나하나가 예/아니오 질문 하나인 스무고개 …
- 최대 엔트로피 원리
… 분산이 되어 늘 양수입니다), 원하는 평균이 나오는 λ를 이분법, 곧 λ의 범위를 반씩 좁혀 가는 방법(이진 탐색과 같은 생각)으로 찾으면 됩니다. 지금 \lambda \approx 입니다. m = 3.5에서는 λ = …
- 호어 논리와 프로그램 검증
이진 탐색페이지는 이진 탐색이 '간단해 보여도 정확하게 짜기는 의외로 까다롭다'고 말합니다. 그렇다면 제대로 …