lower bound, upper bound

Haechan Kim·2022년 1월 27일
0

알고리즘

목록 보기
26/28

https://www.youtube.com/watch?v=k5A3HicbLec

  • Binary Search
    중복된 데이터가 존재하는 배열을 탐색할 경우 좀 더 응용된 방법을 사용해야 한다.

  • Lower Bound
    key보다 크거나 같은 첫번째 값

  • Upper Bound
    key보다 큰 첫번째 값

A{1,3,5,5,7,12,26,33,34} 있을 때
lowerBound(A, size, 5) = 5[2]
upperBound(A, size, 5) = 7[4]
lowerBound(A, size, 6) = 7[4]
upperBound(A, size, 30) = 33[7]

upperbound - lowerbound 하면 key 몇개 있는지 알 수 있다.
key 있는지 없는지 알고싶다면 lowerbound만 있어도 됨.

일반 bs는 값 찾으면 바로 리턴해서 loop 종료함.
but lb, ub는 값 찾았어도 loop 계속 돌아야 시작 위치, 끝 위치 찾을 수 있음.

따라서 일반 bs에서 해당 조건 빼야 함.

public static int binSearch(int[] arr, int key, int start, int end)
{
	int middle;
	while (start <= end)
	{
		middle = (start + end) / 2;
        
		if (arr[middle] == key)  // **  
			return middle;  // ** 이 부분 빼서 1아니면 2에 더해줘야 함. ib, ub는 값이 어디에 더해지느냐에 따라 달라짐
		
		else if (arr[middle] < key) // 1
			start = middle + 1;
		
		else // 2
			end = middle - 1;
	}
	return -1;
}
  • Lower Bound
public static int binSearch(int[] arr, int key, int start, int end)
{
	int middle;
	while (start <= end)
	{
		middle = (start + end) / 2;
		
		if (arr[middle] < key)
			start = middle + 1;
		
		else // 여기에 추가. mid가 key와 같아도(arr[mid] == key) 더 앞쪽에 같은값 있을 수 있으므로 end = mid - 1. 계속 loop 진행
			end = middle - 1;
	}
	return start;
}
  • Upper Bound
public static int binSearch(int[] arr, int key, int start, int end)
{
	int middle;
	while (start <= end)
	{
		middle = (start + end) / 2;
		
		if (arr[middle] <= key) // 여기에 추가. ub는 같은 값 찾아도 계속 뒤쪽으로 가야 함. 즉 start가 이동
			start = middle + 1;
		
		else
			end = middle - 1;
	}
	return start;
}

둘 다 start 리턴하는 이유는 조건문의 마지막 상태 생각하면 알 수 있다.

0개의 댓글

관련 채용 정보