设为首页 加入收藏

TOP

C++ STL next_permutation的实现原理
2014-11-24 07:43:32 来源: 作者: 【 】 浏览:1
Tags:STL next_permutation 实现 原理

next_permutation得到下一个排列,如对序列 a, b, c,每一个元素都比后面的小,它的下一个序列即为a, c, b


next_permutation的函数原型如下:


template
bool next_permutation(
BidirectionalIterator _First,
BidirectionalIterator _Last
);
template
bool next_permutation(
BidirectionalIterator _First,
BidirectionalIterator _Last,
BinaryPredicate _Comp
);



函数实现原理如下:
在当前序列中,从尾端向前寻找两个相邻元素,前一个记为*i,后一个记为*t,并且满足*i < *t。然后再从尾端寻找另一个元素*j,如果满足*i < *j,即将第i个元素与第j个元素对调,并将第t个元素之后(包括t)的所有元素颠倒排序,即求出下一个序列了。


template
bool next_permutation(
BidirectionalIterator first,
BidirectionalIterator last
)
{
if(first == last)
return false; //空序列

BidirectionalIterator i = first;
++i;
if(i == last)
return false; //一个元素,没有下一个序列了

i = last;
--i;

for(;;) {
BidirectionalIterator t = i;
--i;
if(*i < *t) {
BidirectionalIterator j = last;
while(!(*i < *--j));

iter_swap(i, j);
reverse(t, last);
return true;
}

if(i == first) {
reverse(first, last); //全逆向,即为最小字典序列,如cba变为abc
return false;
}
}
}


在STL中,除了next_permutation外,还有一个函数prev_permutation,两者都是用来计算排列组合的函数。前者是求出下一个排列组合,而后者是求出上一个排列组合。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++ STL algorithm库中 next_perm.. 下一篇Android修改开放类方法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Asus Armoury Crate (2025-12-26 02:52:33)
·WindowsFX (LinuxFX) (2025-12-26 02:52:30)
·[ Linux运维学习 ] (2025-12-26 02:52:27)
·HTTPS 详解一:附带 (2025-12-26 02:20:37)
·TCP/IP协议到底在讲 (2025-12-26 02:20:34)