STL next_permutation 간단 한 분석
3474 단어 J#
c + + 의 STL 에 next 가 있다 고 생각 합 니 다.permutation () 은 현재 시퀀스 보다 큰 다음 시퀀스 를 만 들 수 있 습 니 다.
이런 방법 을 통 해 전체 배열 의 비 재 귀적 실현 도 실현 할 수 있다.
STL 원본 다운로드:http://www.sgi.com/tech/stl/download.html
next_permutation () 의 원 함 수 는: stl 에 있 습 니 다.안에
내용 은 다음 과 같다.
// next_permutation and prev_permutation, with and without an explicitly
// supplied comparison function.
template <class _BidirectionalIter>
bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last) {
__STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);
__STL_REQUIRES(typename iterator_traits<_BidirectionalIter>::value_type,
_LessThanComparable);
if (__first == __last)
return false;
_BidirectionalIter __i = __first;
++__i;
if (__i == __last)
return false;
__i = __last;
--__i;
for(;;) {
_BidirectionalIter __ii = __i;
--__i;
if (*__i < *__ii) {
_BidirectionalIter __j = __last;
while (!(*__i < *--__j))
{}
iter_swap(__i, __j);
reverse(__ii, __last);
return true;
}
if (__i == __first) {
reverse(__first, __last);
return false;
}
}
}
기본 사상 은 다음 과 같다.
마지막 으로 서로 인접 한 두 개 를 비교 하면 앞 에 있 는 것 이 뒤의 것 보다 작다 (i 는 작은 위치, ii, 비교적 큰 위치) 면 이때 반드시 하나의 배열 이 현재 의 것 보다 크다 는 것 이 존재 하고 그 다음 에 어떻게 다음 배열 이 생 길 수 있 습 니까?이 작은 수의 뒤 를 마지막 부터 그것 보다 큰 첫 번 째 수 를 찾 아 현재 작은 위치 로 바 꾼 다음 에 큰 수 ii 를 마지막 으로 역 순 으로 해 야 합 니 다.이렇게 해서 다음 배열 이 생 겼 다.원 리 는 다음 에 비교적 큰 것 을 시작 위치 로 하 는 수 를 찾 은 다음 에 뒤의 숫자 를 최소 부터 오름차 로 바 꾸 는 것 과 유사 하 다. 예 를 들 어 원래 4653 에서 5346 으로 바 꾸 는 것 이다.
next_permutation()
{
if no element || only one element
return false;
i = last_element_ptr
while(true)
{
ii = i; // the element before i
--i;
if *i < *ii // then there must be a sequence to change
{
j = last_element_ptr
while( !(*i<*--j) //find the first element from tail to head
{} //which is bigger than *i
swap(i, j) // swap the elements which i and j point to.
reverse(ii, last_element_ptr) // reverse the array
return true;
}
if i == first_element_ptr // if we to the head of the array, so no permutation
{
reverse(first_element_ptr, last_element_ptr)
return false
}
}
}
stl 의 nextpermutation 소스 코드 에서 우 리 는 이미 최대 가중치 의 서열 (즉, 현재 값 보다 큰 배열 이 없 음) 을 보 았 습 니 다. 반환 값 은 false 이지 만 서열 을 역 주 행 했 습 니 다. 예 를 들 어 4321 에 next 를 사용 합 니 다.permutation 후 서열 이 1234 로 바 뀌 었 습 니 다.
오 랜 시련 을 겪 은 소스 코드 를 읽 는 것 이 큰 도움 이 될 것 같다.
이로부터 우 리 는 비 귀속 적 인 전체 배열 을 실현 할 수 있다.허허, 긴 말 할 필요 없 겠 지.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JS 동적 추가 삭제 테이블텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.