일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- haar matrix
- 선택정렬 증명
- BERT
- chatGPT
- Selection Sort
- GPT-3
- ChatGPT 설명
- Discrete Wavelet Transform
- Proof Selection Sort
- 이진탐색 증명
- 이진탐색
- Binary Search Proof
- 선택정렬
- binary search
- Today
- Total
Just Do IT
Binary Search(이진탐색)와 증명 본문
Binary Search
Binary Search는 가장 기본적인 탐색 알고리즘 중 하나다.
Sorting되어있는 배열의 중간값을 기준으로 크기를 비교하는 과정을 반복하여 search를 진행한다.

만약 77을 찾는다고 하면 가장 먼저 1부터 100 사이의 중간인 middle인 50을 찍는다. 50 < 77 이므로 50이하는 볼 필요가 없기 때문에 버릴 수 있다.
따라서 다음 search에서는 51부터 100 사이의 반을 찍으면 된다.
위의 그림 3번째 search처럼 87 > 77이 되면 87 이후로는 볼 필요가 없기 때문에 버릴 수 있다.
따라서 다음 search에서는 75부터 86 사이의 반을 찍으면 된다.
반복적으로 반을 나눠 (n/2) 들어가기 때문에 시간에 search가 진행된다. n은 배열의 크기를 말한다.
Why ?
내가 가장 처음 Big-O notation을 접했을 때 나는 왜 반복적으로 2로 나눠지면 이 되는지 직관적으로 이해가 되지 않았다. 그래서 간단하게 설명해보려고 한다.
n에서 반복적으로 2로 나눠지다보면 결국 1이 될 때 까지 나눠진다.
이를 반대로 생각해서 1에서 2를 몇번 곱해야 N이 되는지에 대해 나타낼 수 있다.
이 식에서 k는 결국 "몇번"에 해당하는 수식이 되고 k에 대해서 정리하면
즉, 1에 2를 logN번 곱하면 N이되고 반대로 N에서 2를 logN번 나누면 1이되는 것이다.
구현 - while을 이용한 구현
구현 - 재귀를 이용한 구현
증명(Proof)
대부분 알고리즘을 공부하는 사람이라면 알고리즘을 당연히 다 돌릴 수 있다. 하지만 왜 정확한가?에 대한 답을 낼 수 있는 사람은 많이 없다. 우리 학교 교수님이 강조하시는 점도 바로 이런점이다. 코드를 갖다 쓸 수는 있지만 왜 정확한지를 알아야 어떤게 되고 어떤게 되지 않는지, 더 나아가 많은 응용을 할 수 있게된다.
1. Proof by Invariant
알고리즘을 돌면서 변하지 않는 특성에 관한 것이다.
- Invariant: 만약 어떤 i에 대해서 a[i] = x라면 l<=i<=r이 항상 성립한다.
Invariant는 처음부터 성립하고 이 Invariant를 깰 코드는 없다.
- a[i] = x인 i가 없다면 loop은 반드시 끝나고 -1이 return된다.
- a[i] = x인 i가 있다면 loop안에서 index가 반드시 return된다.
2. Proof by Induction (수학적 귀납법)
알고리즘의 많은 부분을 수학적 귀납법을 통해서 증명할 수 있다. Binary Search또한 귀납법을 통해 증명할 수 있다.
- 증명하고 싶은 것: search라는 이진탐색 함수가 만약 어떤 i에 대해서 a[i]면 위 함수는 반드시 i를 return한다.
- Base: n = 0인 경우 즉, 배열의 크기가 0인 경우에는 위의 주장이 성립할 방법이 없으므로 -1을 return한다.
- Step - Case 1: a[m] = x인 경우 당연히 m을 return할 것이므로 위의 주장이 성립된다.
- Step - Case 2: a[m] > x인 경우 a[m],a[m+1],...a[n-1] 중에서는 x와 같은 값이 없고, a[i] == x인 i가 있다면 i는 0,1...m-1 중 하나일 것이다. 귀납적으로 search가 정확하다고 가정하면 search함수는 즉, 0부터 m-1 사이에서 위의 주장 'search라는 이진탐색 함수가 만약 어떤 i에 대해서 a[i]면 위 함수는 반드시 i를 return한다.'가 성립한다.
- Step - Case 3: a[m] < x인 경우 a[0],a[1],...a[m] 중에서는 x와 같은 값이 없고, a[i] == x인 i가 있다면 i는 m+1,1...n-1 중 하나일 것이다. 귀납적으로 search가 정확하다고 가정하면 search함수는 즉, m+1부터 n-1 사이에서 위의 주장 'search라는 이진탐색 함수가 만약 어떤 i에 대해서 a[i]면 위 함수는 반드시 i를 return한다.'가 성립한다.
'자료구조-알고리즘(Python) > 알고리즘' 카테고리의 다른 글
Selection Sort(선택정렬)과 증명 (0) | 2022.10.31 |
---|