728x90
이진 탐색 구현 알고리즘(재귀)
이진 탐색을 재귀로 구현해보세요.
주의사항
* 반드시 재귀(recursion)의 개념을 사용해야 합니다.
❧ 테스트 셋
def binary_search(element, some_list, start_index=0, end_index=None):
# end_index's default value
if end_index == None:
end_index = len(some_list) - 1
# Code
print(binary_search(2, [2, 3, 5, 7, 11]))
print(binary_search(0, [2, 3, 5, 7, 11]))
print(binary_search(5, [2, 3, 5, 7, 11]))
print(binary_search(3, [2, 3, 5, 7, 11]))
print(binary_search(11, [2, 3, 5, 7, 11]))
❧ 출력 예시
0
None
2
1
4
❧ 정답
Try 1
def binary_search(element, some_list, start_index=0, end_index=None):
if end_index == None:
end_index = len(some_list) - 1
if (element == some_list[start_index]):
return start_index
elif (start_index == end_index):
return None
else:
return binary_search(element, some_list, start_index + 1, end_index)
print(binary_search(2, [2, 3, 5, 7, 11]))
print(binary_search(0, [2, 3, 5, 7, 11]))
print(binary_search(5, [2, 3, 5, 7, 11]))
print(binary_search(3, [2, 3, 5, 7, 11]))
print(binary_search(11, [2, 3, 5, 7, 11]))
1️⃣ 단순 순차 탐색 알고리즘으로 구현
: 결과는 동일하게 나올 수 있으나, 문제에서 제시한 이진 탐색 알고리즘이 아님
시간 복잡도 : O(n)
Try 2
def binary_search(element, some_list, start_index=0, end_index=None):
if end_index == None:
end_index = len(some_list) - 1
# 끝까지 탐색 완료
if start_index > end_index:
return None
# 중간 인덱스 탐색
mid = (start_index + end_index) // 2
if some_list[mid] == element:
return mid
# [요소 값] < [중간 값], 왼쪽 탐색
if element < some_list[mid]:
return binary_search(element, some_list, start_index, mid - 1)
# [요소 값] > [중간 값], 오른쪽 탐색
else:
return binary_search(element, some_list, mid + 1, end_index)
print(binary_search(2, [2, 3, 5, 7, 11]))
print(binary_search(0, [2, 3, 5, 7, 11]))
print(binary_search(5, [2, 3, 5, 7, 11]))
print(binary_search(3, [2, 3, 5, 7, 11]))
print(binary_search(11, [2, 3, 5, 7, 11]))
1️⃣ 입력 리스트의 값이 순차 정렬되어 있는 경우에만 가능
2️⃣ 중간 값 도출을 통해 탐색 진행에 따라 탐색 범위가 반씩 줄어듦
시간 복잡도 : log(n)
728x90
'📊 Algorithm > Algorithm PS' 카테고리의 다른 글
[알고리즘 일기] 6. 선형 탐색 구현 알고리즘 (0) | 2021.05.06 |
---|---|
[알고리즘 일기] 5. 하노이의 탑 (0) | 2021.05.05 |
[알고리즘 일기] 3. 숫자 합, 자릿수 합 (0) | 2021.05.03 |
[알고리즘 일기] 2. 피보나치 수열 (0) | 2021.05.02 |
[알고리즘 일기 - 파이썬] 1. 팔린드롬 문제 (0) | 2021.05.01 |