stl算法:next_permutation剖析
转载:http://blog.csdn.net/aipb2008/article/details/2227490
其实还有一个 prev_permutation 函数
在标准库算法中,next_permutation应用在数列操作上比较广泛.这个函数可以计算一组数据的全排列.但是怎么用,原理如何,我做了简单的剖析.
首先查看stl中相关信息.
函数原型:
template<class BidirectionalIterator>
bool next_permutation(
BidirectionalIterator _First,
BidirectionalIterator _Last
);
template<class BidirectionalIterator, class BinaryPredicate>
bool next_permutation(
BidirectionalIterator _First,
BidirectionalIterator _Last,
BinaryPredicate _Comp
);
两个重载函数,第二个带谓词参数_Comp,其中只带两个参数的版本,默认谓词函数为"小于".
返回值:bool类型
分析next_permutation函数执行过程:
假设数列 d1,d2,d3,d4……
范围由[first,last)标记,调用next_permutation使数列逐次增大,这个递增过程按照字典序。例如,在字母表中,abcd的下一单词排列为abdc,但是,有一关键点,如何确定这个下一排列为字典序中的next,而不是next->next->next……
若当前调用排列到达最大字典序,比如dcba,就返回false,同时重新设置该排列为最小字典序。
返回为true表示生成下一排列成功。下面着重分析此过程:
根据标记从后往前比较相邻两数据,若前者小于(默认为小于)后者,标志前者为X1(位置PX)表示将被替换,再次重后往前搜索第一个不小于X1的数据,标记为X2。交换X1,X2,然后把[PX+1,last)标记范围置逆。完成。
要点:为什么这样就可以保证得到的为最小递增。
从位置first开始原数列与新数列不同的数据位置是PX,并且新数据为X2。[PX+1,last)总是递减的,[first,PX)没有改变,因为X2>X1,所以不管X2后面怎样排列都比原数列大,反转[PX+1,last)使此子数列(递增)为最小。从而保证的新数列为原数列的字典序排列next。
明白了这个原理后,看下面例子:
int main(){
int a[] = {3,1,2};
do{
cout << a[0] << " " << a[1] << " " << a[2] << endl;
}
while (next_permutation(a,a+3));
return 0;
}
输出:312/321 因为原数列不是从最小字典排列开始。
所以要想得到所有全排列
int a[] = {3,1,2}; change to int a[] = {1,2,3};
另外,库中另一函数prev_permutation与next_permutation相反,由原排列得到字典序中上一次最近排列。
所以
int main(){
int a[] = {3,2,1};
do{
cout << a[0] << " " << a[1] << " " << a[2] << endl;
}
while (prev_permutation(a,a+3));
return 0;
}
才能得到123的所有排列。
转载于:https://www.cnblogs.com/luotinghao/p/3413148.html
stl算法:next_permutation剖析相关推荐
- STL源码剖析 数值算法 copy 算法
copy复制操作,其操作通过使用assignment operator .针对使用trivial assignment operator的元素型别可以直接使用内存直接复制行为(使用C函数 memove ...
- STL源码剖析 算法开篇
STL源码剖析 算法章节 算法总览_CHYabc123456hh的博客-CSDN博客 质变算法 质变算法 - 会改变操作对象的数值,比如互换.替换.填写.删除.排列组合.分隔.随机重排.排序等 #in ...
- 【STL源码剖析】list模拟实现 | 适配器实现反向迭代器【超详细的底层算法解释】
今天博主继续带来STL源码剖析专栏的第三篇博客了! 今天带来list的模拟实现! 话不多说,直接进入我们今天的内容! 前言 那么这里博主先安利一下一些干货满满的专栏啦! 手撕数据结构https://b ...
- STL源码剖析 算法章节 算法总览
(以 下 "质变"栏意指mutating,意思是 "会改变其操作对象之内容") 其余注意事项 将无效的迭代器传给某个算法,虽然是一种错误,却不保证能够在编译时期 ...
- 《STL源码剖析》相关面试题总结
一.STL简介 STL提供六大组件,彼此可以组合套用: 容器 容器就是各种数据结构,我就不多说,看看下面这张图回忆一下就好了,从实现角度看,STL容器是一种class template. 算法 各种常 ...
- 《STL源码剖析》学习--6章--_rotate算法分析
最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. <STL源码剖析>学习--6章--random access ite ...
- 《STL源码剖析》学习--6章--power算法分析
最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. 6章--power算法分析 书本中的算法如下所示: template <clas ...
- STL算法algorithm,
2019独角兽企业重金招聘Python工程师标准>>> STL算法部分主要由头文件<algorithm>,<numeric>,<functional&g ...
- STL源码剖析——P142关于list::sort函数
在list容器中,由于容器自身组织数据的特殊性,所以list提供了自己的排序函数list::sort, 并且实现得相当巧妙,不过<STL源码剖析>的原文中,我有些许疑问,对于该排序算法,侯 ...
- STL算法学习[转]
原文:http://www.cppblog.com/mzty/archive/2007/03/14/19819.html STL算法学习,小结如下: 前提: 下载stl源码: http://www. ...
最新文章
- 使用wireshark分析TLSv2(详细)
- 【刷算法】判断链表是否有环以及返回入环节点
- 1050 String Subtraction
- Android开发之选项菜单(optinosMenu)
- Why Opportunity list is empty
- 收集计算机网络经典的面试题
- java is start_PHP IntlChar::isJavaIDStart()用法及代码示例
- SSDTShadow Hook的实现,完整代码。可编译
- redis学习-主从复制Master/slave
- java数组排序函数
- 开放网络操作系统介绍(2)、SONiC
- C51单片机实现 贪吃蛇
- matlab length什么意思,matlab中的length什么意思?如何应用?
- UIImageView做动画的坑
- 详解微信涨粉最有效的5个思路及战略策略
- 中国运动传感器陀螺仪行业市场供需与战略研究报告
- Oracle - Spool导出数据到TXT文件
- 滴滴公布自查进展:免去黄洁莉顺风车事业部总经理职务
- 强化学习中的递归神经网络
- Electron常见问题 3-Error: sha512 checksum mismatch, expected
热门文章
- re.sub对多处字符串进行替换
- Linux常用知识与命令
- js能判断当前字符串是一个完整单词吗_LeetCode30串联所有单词的子串31下一个排列...
- 蛮力法求最大字段和时间复杂度_中文分词算法之--最大匹配法
- thinkphp去重,distinct、group
- java configuration类_使用@Configuration编写自定义配置类
- JDBC09 CLOB文本大对象
- 下载centos(阿里云)
- zookeeper 与dubbo管理平台Window 安装与使用
- Ubuntu 14.04 desktop 不能安装 openssh-server解决方法