wistlin47   2년 전

제가 구현한 lower boind랑 upperbound로 값을 찾을시 틀렸다고 뜹니다.... 저거를 그냥 라이브러리에 있는 lower upper을 쓰면 맞다고 뜨는거 보면 이진탐색 에 문제가 있느거 같은데 못찾겠어요ㅠㅠ

greg3566   2년 전

https://www.cplusplus.com/refe...

라이브러리에 있는 upper_bound의 return을 확인해보시면 좋을 것 같습니다.

yijw0930   2년 전

라이브러리의 함수처럼 동작하려면 end를 B.size()로 초기화해야 할 것 같습니다.

wistlin47   2년 전

B.size()로 초기화 하면 잘못된 인덱스에 접근하지 않나요..? 보통 이진탐색 문제들 다 저렇게 해서 맞았었는데

잘못된 이유를 알수 있을까여?ㅠㅠ

yijw0930   2년 전

얼핏 보면 잘못된 인덱스에 접근할 것처럼 보이지만 항상 middle<end이므로 실제로 B[end]에 접근할 일은 없습니다.

line73에서 upper과 lower의 차=target의 개수로 생각하고 푸신 것으로 보이는데, std::lower_bound와 std::upper_bound로는 아무 문제가 없지만 직접 구현된 upper에서는 다음과 같은 반례가 생길 수 있습니다.

let B={1,2,3,4,5},

lower(5)=4

upper(5)=4

wistlin47   2년 전

아 !! std::upper_bound가 제가 그동안 알고 있던거랑 많이 달랐네여. 감사합니다!

댓글을 작성하려면 로그인해야 합니다.