개념
이진탐색의 상한선, 하한선은 이진탐색 알고리즘에서 약간 변경된 것이다.
중복된 자료가 있을 때 유용하게 사용된다.
1. 하한선[Lower bound]
데이터내에서 원하는 값보다 '같거나 큰 값' 중에 가장 앞에 있는 원소의 위치를 리턴한다.
위 이미지에서 lower_bound(3)은 index 3이다.
2. 상한선[Upper bound]
데이터내에서 원하는 값보다 '큰 값' 중에 가장 앞에 있는 원소의 위치를 리턴한다.
위 이미지에서 upper_bound(3)은 index 6이다.
+ 만약 모든 데이터가 원하는 값보다 작을 경우?
데이터 범위밖의 값을 리턴해야 한다.
그래서 일반적인 이분탐색과 달리 high를 len(array)-1이 아니라 len(array)로 한다.
구현
# 이진탐색
def binary_search(array, target):
low = 0
high = len(array) - 1
while low <= high:
mid = (low + high) // 2
if array[mid] == target:
return mid
elif array[mid] < target:
low = mid + 1
else:
high = mid - 1
return -1
# 하한선
def lower_bound(array, target):
low = 0
high = len(array)
while low < high:
mid = (low + high) // 2
if array[mid] >= target:
high = mid
else:
low = mid + 1
return low
# 상한선
def upper_bound(array, target):
low = 0
high = len(array)
while low < high:
mid = (low + high) // 2
if array[mid] <= target:
low = mid + 1
else:
high = mid
return low
li = [1, 2, 2, 3, 3, 3, 4, 6, 7]
print(binary_search(li, 3))
print(lower_bound(li, 3))
print(upper_bound(li, 3))
실행결과
4
3
6
'알고리즘 > 개념' 카테고리의 다른 글
[최단 경로 트리] 플로이드-워셜 알고리즘[Floyd-Warshall] (0) | 2022.03.17 |
---|---|
[이진탐색] 깊이 우선 탐색[DFS]과 백트래킹[Backtracking] 차이점 (0) | 2022.03.07 |
[정렬] 각 정렬의 장단점 및 시간 복잡도 (0) | 2022.02.10 |
[정렬] 삽입 정렬 [Insertion Sort] (0) | 2022.02.10 |
[정렬] 선택 정렬 [Selection Sort] (0) | 2022.02.09 |