defbinary_search(arr,target):"""
정렬된 배열에서 대상 값의 인덱스를 찾는 이진 탐색 함수
Args:
arr: 정렬된 배열
target: 찾으려는 값
Returns:
대상 값의 인덱스 또는 찾지 못한 경우 -1
"""left=0right=len(arr)-1whileleft<=right:# 중간 인덱스 계산 (오버플로우 방지를 위한 최적화 방법)mid=left+(right-left)//2# 중간 요소가 대상 값인 경우ifarr[mid]==target:returnmid# 대상 값이 중간 요소보다 작은 경우, 왼쪽 부분 배열 검색elifarr[mid]>target:right=mid-1# 대상 값이 중간 요소보다 큰 경우, 오른쪽 부분 배열 검색else:left=mid+1# 값을 찾지 못한 경우return-1
/**
* 정렬된 배열에서 대상 값의 인덱스를 찾는 이진 탐색 함수
* @param {Array} arr - 정렬된 배열
* @param {number} target - 찾으려는 값
* @returns {number} - 대상 값의 인덱스 또는 찾지 못한 경우 -1
*/functionbinarySearch(arr,target){letleft=0;letright=arr.length-1;while(left<=right){// 중간 인덱스 계산 (오버플로우 방지를 위한 방법)
constmid=Math.floor(left+(right-left)/2);// 중간 요소가 대상 값인 경우
if(arr[mid]===target){returnmid;}// 대상 값이 중간 요소보다 작은 경우, 왼쪽 부분 배열 검색
elseif(arr[mid]>target){right=mid-1;}// 대상 값이 중간 요소보다 큰 경우, 오른쪽 부분 배열 검색
else{left=mid+1;}}// 값을 찾지 못한 경우
return-1;}
defbinary_search_recursive(arr,target,left,right):"""
재귀적 이진 탐색 구현
Args:
arr: 정렬된 배열
target: 찾으려는 값
left: 왼쪽 경계 인덱스
right: 오른쪽 경계 인덱스
Returns:
대상 값의 인덱스 또는 찾지 못한 경우 -1
"""# 기저 사례: 검색 범위가 없는 경우ifleft>right:return-1# 중간 인덱스 계산mid=left+(right-left)//2# 중간 요소가 대상 값인 경우ifarr[mid]==target:returnmid# 대상 값이 중간 요소보다 작은 경우, 왼쪽 부분 배열 검색elifarr[mid]>target:returnbinary_search_recursive(arr,target,left,mid-1)# 대상 값이 중간 요소보다 큰 경우, 오른쪽 부분 배열 검색else:returnbinary_search_recursive(arr,target,mid+1,right)# 사용 예:# result = binary_search_recursive(sorted_array, target_value, 0, len(sorted_array) - 1)
deflower_bound(arr,target):"""배열에서 target 이상인 첫 번째 요소의 인덱스를 찾습니다."""left,right=0,len(arr)whileleft<right:mid=left+(right-left)//2ifarr[mid]<target:left=mid+1else:right=midreturnleftdefupper_bound(arr,target):"""배열에서 target보다 큰 첫 번째 요소의 인덱스를 찾습니다."""left,right=0,len(arr)whileleft<right:mid=left+(right-left)//2ifarr[mid]<=target:left=mid+1else:right=midreturnleft
defsearch_in_rotated_array(arr,target):"""회전된 정렬 배열에서 대상 값을 찾습니다."""left,right=0,len(arr)-1whileleft<=right:mid=left+(right-left)//2ifarr[mid]==target:returnmid# 왼쪽 절반이 정렬되어 있는 경우ifarr[left]<=arr[mid]:ifarr[left]<=target<arr[mid]:right=mid-1else:left=mid+1# 오른쪽 절반이 정렬되어 있는 경우else:ifarr[mid]<target<=arr[right]:left=mid+1else:right=mid-1return-1