이진탐색
- 사용 : 탐색 범위가 큰 상황에서의 탐색
- 전제조건 : 데이터가 정렬되어있어야
- 트리 자료구조 사용해 항상 정렬 상태 유지하는것이 good
- 시간복잡도 : O(logN)
처음부터 끝까지 찾을때까지 순서대로 조회
당연히 최악의 시간복잡도는 O(N)
ex) 정렬된 10개 데이터 중 4인 원소 찾기
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
0 | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | |
1회차 | 시작점 | 중간점 | 끝점 | |||||||
2회차 | 시작점 | 중간점 | 끝점 | |||||||
3회차 | 시작점&중간점 | 끝점 |
간단한 컨셉 ) 한 단계를 거칠때마다 확인하는 원소가 평균적으로 절반으로 줄어듬
ex) 32 -> 16 -> 8 -> 4 -> 2
단계마다 2로 나누는 것과 동일하므로 연산횟수는 log(2)N
컴퓨터 수학에서의 log 밑은 디폴트 2니까 logN으로 표기
이진탐색 코드를 제대로 작성하는 사람은 의외로 적다고 한다.
코테 단골 문제이니 코드를 가급적 외울 것.
def binary_search(array, target, start, end) :
while start <= end :
mid = (start+end) // 2
# 찾은 경우 중간점 인덱스 반환
if array[mid] == target :
return mid
# 중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인
elif array[mid] > target :
end = mid - 1
# 중간점의 값보다 찾괒 하는 값이 큰 경우 오른쪽 확인
else :
start = mid + 1
return None
# n(원소의 갯수)와 target(찾고자 하는 문자열) 을 입력받기
n, target = list(map(int, input().split()))
# 전체 원소 입력받기
array = list(map(int, input().split()))
# 이진 탐색 수행 결과 출력
result = binary_search(array, target, 0, n-1)
if result == None :
print("원소가 존재하지 않습니다.")
else :
print(result + 1)
def binary_search(array, target, start, end) :
if start > end : # 종료조건
return None
mid = (start+end) // 2 # 중간점 설정
if array[mid] == target : # 찾은 경우
return mid
# 중간점 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인
elif array[mid] > target :
return binary_search(array, target, start, mid-1)
else :
return binary_search(array, target, mid+1, end)
# 원소의 갯수와 찾고자하는 문자열 입력받기
n, target = list(map(int, input().split()))
# 전체 원소 입력받기
array = list(map(int, input().split()))
# 이진 탐색 수행 결과 출력
result = binary_search(array, target, 0, n-1)
print(result)