주요 내용
이진 검색 실행 시간
여기서 핵심 개념은 다음과 같습니다. 이진 탐색에서는 기준값과 배열의 정중앙에 있는 데이터를 비교하여 맞지 않을 경우 배열에 있는 기준값과 일치하지 않는 다른 쪽에 있는 값들은 모두 버립니다. 따라서 남은 값들에 대한 탐색을 다시 시작할 때 옳은 값을 찾을 확률은 이전 탐색에 비해 최대 두 배가 올라갑니다. 예를 들어 어떤 32개의 데이터가 있다고 가정해봅시다. 정렬된 데이터 중간의 어떤 값 하나를 비교해 보았더니 찾는 값보다 더 커서 이 값보다 큰 값들을 모두 버렸습니다. 그럼 남은 16개의 더 작은 값 중에서 탐색을 다시 시작하여 원하는 값을 찾게 됩니다. 이처럼 이진 탐색은 비교값이 틀릴 때마다 값의 범위를 반으로 줄입니다.
만일 길이가 8인 배열에서 탐색을 시작하여 비교값이 틀리면 다시 4개의 값에서 탐색하고 다음으로 2, 1 순으로 줄여나갑니다. 탐색하는 배열 안에 값이 한 개만 남아있으면 비교값과 일치 여부에 상관없이 탐색은 종료됩니다. 따라서 길이가 8인 배열의 경우 이진 탐색은 최대 네 번 탐색을 합니다.
그렇다면 배열에 값이 16개 있을 경우에는 어떻게 될까요? 첫 번째 탐색이 최소 8개의 값을 제외시켜서 남는 8개의 값에 대해 탐색을 한다고 생각했다면 이해를 올바르게 하고 있는 것입니다. 따라서 16개의 값을 가지는 배열에서는 탐색을 최대 5번만 하면 됩니다.
지금쯤이면 슬슬 규칙이 보이기 시작할 겁니다. 배열이 두 배 커질때마다 최대 탐색 횟수는 한 번 늘어납니다. 길이가 인 배열에 최대 번 만큼의 탐색이 필요하다고 가정해봅시다. 그렇다면 길이가 인 배열에서는 첫 번째 탐색을 한 다음 탐색 범위가 으로 절반이 되므로 최대 번의 탐색만 하면 원하는 값을 받드시 찾게됩니다. 따라서 이 경우 최대 번의 탐색이 필요합니다.
길이가 인 배열의 경우에 최악의 경우 추측 횟수는 에서 시작해 1에 이르기까지 반복적으로 반으로 나누는 횟수 더하기 1이라고 할 수 있습니다. 하지만 이것을 말로 쓰기엔 불편합니다.
다행히 에서 시작해 1에 이르기까지 반복적으로 반으로 나누는 횟수를 뜻하는 수학 함수가 존재합니다. 바로 2를 밑으로 하는 의 로그입니다. 이는 보통 이라고 쓰지만 컴퓨터 과학에서는 이라고 쓸 때도 있습니다. (로그에 대해 더 알고 싶다면 여기를 살펴보세요.)
아래 표는 2를 밑으로 하는 의 로그함수 값 중 일부입니다:
1 | 0 |
2 | 1 |
4 | 2 |
8 | 3 |
16 | 4 |
32 | 5 |
64 | 6 |
128 | 7 |
256 | 8 |
512 | 9 |
1024 | 10 |
1,048,576 | 20 |
2,097,152 | 21 |
이 표를 그래프로 나타낼 수도 있습니다:
n 값의 범위를 줄여서 그래프를 확대해 보겠습니다:
로그함수는 매우 천천히 증가합니다. 로그함수는 매우 빠르게 증가하는 지수함수와 역의 관계에 있습니다. 로그함수가 라면 그에 대응하는 지수함수는 입니다. 예를 들어 이라면, 이라고 알 수 있습니다.
항성 2,539,913개를 가진 Tycho-2 항성 목록의 경우 가장 가까운 2의 제곱은 ( 2,097,152)이므로, 최대 22번의 추측이 필요합니다. 선형 검색보다 훨씬 낫습니다.
다음은 과 를 비교한 그래프입니다:
다음 튜토리얼에서는 컴퓨터 과학자들이 선형 검색과 이진 검색의 실행 시간 중 가장 중요한 부분만을 추려내고 덜 중요한 부분을 없애는 방법을 통해 실행 시간의 특징을 어떻게 정의하는지 알아보게 될 것입니다.
위 자료는 다트머스 대학교 컴퓨터공학과의 토마스 콜먼 교수와 데빈 발컴 교수, 그리고 칸아카데미 컴퓨팅 과정 팀이 공동으로 저술했으며, 본 내용물의 저작권은 CC-BY-NC-SA 라이선스를 적용합니다.
대화에 참여하고 싶으신가요?
- 저만 어려운 건지 잘 모르겠는데... 아는 사람은 좀 쉽게 풀어서 정리해 주실 수 있을까요..?(추천 1 번)
- 배열이 2배 커질 때마다 탐색 횟수가 1회 늘어난다는 의미는 제곱 횟수랑 관계가 있습니다.
배열의 길이가 2(2¹)일 때 탐색은 1번 걸립니다.
배열의 길이가 4(2²)일 때 탐색은 2번 걸립니다.
배열의 길이가 8(2³)일 때 탐색은 3번 걸립니다.
배열의 길이가 2ⁿ일 때 탐색은 n번 걸립니다.
...
배열의 길이 n이 2의 제곱이 아닌 경우 가장 가까운 2의 제곱수로 판단합니다.
길이가 1000인 경우 2⁹(512) < 1000 < 2¹⁰ (1024) 이므로 9회에서 10회 사이로 추측할 수 있습니다.
길이가 400인 경우 2⁸(256) < 400 < 2⁹(512) 이므로 8회에서 9회 사이로 추측할 수 있습니다.
즉, 선형탐색의 경우 m (= 2ⁿ)회 탐색이 필요하지만 이진탐색의 경우 2의 제곱 횟수인 log m = log 2ⁿ= n 만큼만 탐색하므로 그래프의 모양처럼 탐색횟수를 비약적으로 단축할 수 있습니다.(추천 1 번)
- 응용:이진 검색에서 어떻게 하는 건가요?(추천 1 번)