본문 바로가기
Programming/Tips(C++,C#)

Algorithm : Binary search

by 곰네Zip 2011. 10. 11.

참고자료
c++.com : http://cplusplus.com/reference/
일반적프로그래밍과 STL책.

저도 잘 모르는 내용이지만 제 임의대로 제가 기억하려고 올리는 것이므로 태클 환영합니다.

Lower_bound : 2진검색 알고리즘. 구간 first-last안에서 value를 찾는다. value보다 작지않은 첫번째 인자를 리턴해줌.

template <class ForwardIterator, class T>

  ForwardIterator lower_bound ( ForwardIterator first, ForwardIterator last, const T& value )

{

  ForwardIterator it;

  iterator_traits<ForwardIterator>::distance_type count, step;

  count = distance(first,last);

  while (count>0)

  {

    it = first; step=count/2; advance (it,step);

    if (*it<value)                   // or: if (comp(*it,value)), for the comp version

      { first=++it; count-=step+1;  }

    else count=step;

  }

  return first;

}

 


 

 

Upper_bound : 정렬된 구간 first-last사이에서 value를 찾는 2진검색 알고리즘. 정렬순서를 위반하지않고 value assign할 수 있는 위치를 리턴해줌.

template <class ForwardIterator, class T>

  ForwardIterator upper_bound ( ForwardIterator first, ForwardIterator last, const T& value )

{

  ForwardIterator it;

  iterator_traits<ForwardIterator>::distance_type count, step;

  count = distance(first,last);

  while (count>0)

  {

    it = first; step=count/2; advance (it,step);

    if (!(value<*it))                 // or: if (!comp(value,*it)), for the comp version

      { first=++it; count-=step+1;  }

    else count=step;

  }

  return first;

}

 

Equal_range : 정렬된 구간 first-last사이에서 value를 찾는다. 순서를 깨지않고 value를 삽입할 수 있는 첫번째 반복자(lower_bound)와 마지막 반복자(upper_bound)로 된 하나의 pair. , lower_bound upper_bound를 합친것임.

template <class ForwardIterator, class T>

  pair<ForwardIterator,ForwardIterator>

    equal_range ( ForwardIterator first, ForwardIterator last, const T& value )

{

  ForwardIterator it = lower_bound (first,last,value);

  return make_pair ( it, upper_bound(it,last,value) );

}

 

Binary_search : 정렬된 구간에서 value와 같은 값을 가진 요소를 찾으면 true, 아니면 false

template <class ForwardIterator, class T>

  bool binary_search ( ForwardIterator first, ForwardIterator last, const T& value )

{

  first = lower_bound(first,last,value);

  return (first!=last && !(value<*first));

}

 

반응형

댓글