1. 순차 탐색
- 리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 확인하는 방법
2. 이진 탐색
- 정렬되어 있는 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방법
- 시작점, 끝점, 중간점을 이용하여 탐색 범위를 설정
3. 이진 탐색 동장 예시
- 이미 정렬된 10개의 데이터 중에서 값이 4인 원소를 찾는 예시
[Step 1]
- 인덱스 시작점 : 0, 끝점 : 9, 중간점 : 4
- 중간지점은 인덱스 4.5인데 소수점 이하는 제거하므로 4즉, 인덱스 4번째를 중간점으로 선택
- 중간점과 찾고자하는 값(4)를 비교한다. 오른쪽은 필요가 없을 것이다.
[Step 2]
- 시작점: 0, 끝점: 3, 중간점: 1
- 끝점은 중간점 바로 앞으로 바뀌고 다시 시작한다.
- 중간점이 찾고자 하는쪽의 오른쪽에 있으므로 왼쪽은 모두 제거한다.
[Step 3]
- 시작점: 2, 끝점:3, 중간점: 2
- 총 3번만에 찾고자하는 값을 찾게된다.
4. 이진 탐색의 시간 복잡도
- 단계마다 탐색 범위를 반으로 나누므로 연산 횟수는 logN에 비례한다.
- 32개의 데이터가 있을 때 매단계마다 16, 8, 4로 쭉쭉 줄어든다.
5. 이진 탐색 소스코드(재귀적 구현)
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)
- if문 데이터가 존재하지 않을 때는 None을 반환
- 아니면 중간점을 mid로 찾아준다.
- 찾은 경우, 중간점 보다 작은경우, 큰경우 3가지를 제귀함수를 통해 만든다.
#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)
- if result == None은 원소가 없을 경우
#출력 결과
10 7
1 3 5 7 9 11 13 15 17 19
4
6. 이진 탐색 소스코드: 반복문 구현
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
'CodingTest > 이진 탐색' 카테고리의 다른 글
정렬된 배열에서 특정 수의 개수 구하기 (0) | 2022.07.12 |
---|---|
떡볶이 떡 만들기 (0) | 2022.07.12 |
값이 특정 범위에 속하는 데이터 개수 구하기 (0) | 2022.07.12 |