안녕하세요 jay입니다.
오늘은 파이썬으로 이분탐색(binary search)에 대해 알아보겠습니다.
1. 이진탐색 알고리즘(Binary Search Algorithm)
이진탐색 알고리즘이란 정렬된 데이터를 기준으로,
*중간 위치를 찾아 찾는 값과 중간 위치 값을 비교합니다.
먼저 시작 인덱스와 맨 끝인덱스, 중간 인덱스를 선정합니다.
만약 찾는 값이 중간 위치 값보다 크면, 현재 중간 인덱스의 다음 인덱스를 시작 인덱스로 옮깁니다.
만약 찾는 값이 중간 위치 값보다 작으면, 중간 인덱스의 이전 인덱스를 끝 인덱스로 옮깁니다.
그리고 *로 돌아가 계속 반복해서 원하는 값을 탐색하는 알고리즘입니다.
2. 시간 복잡도
결론부터 말씀드리면 이진탐색 알고리즘의 시간복잡도는 O(logN)입니다.
간단하게 증명을 해보면
처음 입력한 데이터숫자를 N이라고 가정합니다.
첫 시행때 1/2 *N
두번째 시행때 1/2 * 1/2 * N
세번째 시행때 1/2 * 1/2 * N
즉 시행횟수를 K라고 둔다면
(1/2)^K * N = 1(1에 수렴을 의미)이라고 볼 수 있습니다.
여기에 2^K를 곱하면
N = 2^K이고 여기에 양변에 로그를 취하면
K = 입니다.
즉 자료갯수에 따른 시행횟수, 시간 복잡도는 Big O표기법으로 O(logN)이라는 것을 알 수 있습니다.
(상수부분은 무시)
2. 시간 복잡도
결론부터 말씀드리면 이진탐색 알고리즘의 시간복잡도는 O(logN)입니다.
간단하게 증명을 해보면
처음 입력한 데이터숫자를 N이라고 가정합니다.
첫 시행때 1/2 *N
두번째 시행때 1/2 * 1/2 * N
세번째 시행때 1/2 * 1/2 * N
즉 시행횟수를 K라고 둔다면
(1/2)^K * N = 1(1에 수렴을 의미)이라고 볼 수 있습니다.
여기에 2^K를 곱하면
N = 2^K이고 여기에 양변에 로그를 취하면
K = 입니다.
즉 자료갯수에 따른 시행횟수, 시간 복잡도는 Big O표기법으로 O(logN)이라는 것을 알 수 있습니다.
(상수부분은 무시)
3. 소스코드
# binary_search Algorithm def binary_search(a,x): start = 0 end = len(a)-1 while start <= end: mid = (start+end)//2 if x == a[mid]: return mid elif x > a[mid]: start = mid +1 else: end = mid-1 return -1 a = [1,4,9,16,20,24,30,49,84] inputNum = int(input("input number you wanna find: ")) c =binary_search(a, inputNum) print("It is index of number you wanna find: ",c)
4. 나의 뻘짓 방식
위처럼 인덱스를 활용하여 위치값만 반환하는 코드를 만들면 되는데,
나같은 경우 찾는 값보다 작거나 크면, 기존 리스트를 일일이 슬라이싱해서
원래 인덱스를 찾아내는 로직을 또 다시 짜야했다.
댓글
댓글 쓰기