转载: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剖析相关推荐

  1. STL源码剖析 数值算法 copy 算法

    copy复制操作,其操作通过使用assignment operator .针对使用trivial assignment operator的元素型别可以直接使用内存直接复制行为(使用C函数 memove ...

  2. STL源码剖析 算法开篇

    STL源码剖析 算法章节 算法总览_CHYabc123456hh的博客-CSDN博客 质变算法 质变算法 - 会改变操作对象的数值,比如互换.替换.填写.删除.排列组合.分隔.随机重排.排序等 #in ...

  3. 【STL源码剖析】list模拟实现 | 适配器实现反向迭代器【超详细的底层算法解释】

    今天博主继续带来STL源码剖析专栏的第三篇博客了! 今天带来list的模拟实现! 话不多说,直接进入我们今天的内容! 前言 那么这里博主先安利一下一些干货满满的专栏啦! 手撕数据结构https://b ...

  4. STL源码剖析 算法章节 算法总览

    (以 下 "质变"栏意指mutating,意思是 "会改变其操作对象之内容") 其余注意事项 将无效的迭代器传给某个算法,虽然是一种错误,却不保证能够在编译时期 ...

  5. 《STL源码剖析》相关面试题总结

    一.STL简介 STL提供六大组件,彼此可以组合套用: 容器 容器就是各种数据结构,我就不多说,看看下面这张图回忆一下就好了,从实现角度看,STL容器是一种class template. 算法 各种常 ...

  6. 《STL源码剖析》学习--6章--_rotate算法分析

     最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. <STL源码剖析>学习--6章--random access ite ...

  7. 《STL源码剖析》学习--6章--power算法分析

    最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. 6章--power算法分析 书本中的算法如下所示: template <clas ...

  8. STL算法algorithm,

    2019独角兽企业重金招聘Python工程师标准>>> STL算法部分主要由头文件<algorithm>,<numeric>,<functional&g ...

  9. STL源码剖析——P142关于list::sort函数

    在list容器中,由于容器自身组织数据的特殊性,所以list提供了自己的排序函数list::sort, 并且实现得相当巧妙,不过<STL源码剖析>的原文中,我有些许疑问,对于该排序算法,侯 ...

  10. STL算法学习[转]

    原文:http://www.cppblog.com/mzty/archive/2007/03/14/19819.html STL算法学习,小结如下: 前提: 下载stl源码:  http://www. ...

最新文章

  1. 使用wireshark分析TLSv2(详细)
  2. 【刷算法】判断链表是否有环以及返回入环节点
  3. 1050 String Subtraction
  4. Android开发之选项菜单(optinosMenu)
  5. Why Opportunity list is empty
  6. 收集计算机网络经典的面试题
  7. java is start_PHP IntlChar::isJavaIDStart()用法及代码示例
  8. SSDTShadow Hook的实现,完整代码。可编译
  9. redis学习-主从复制Master/slave
  10. java数组排序函数
  11. 开放网络操作系统介绍(2)、SONiC
  12. C51单片机实现 贪吃蛇
  13. matlab length什么意思,matlab中的length什么意思?如何应用?
  14. UIImageView做动画的坑
  15. 详解微信涨粉最有效的5个思路及战略策略
  16. 中国运动传感器陀螺仪行业市场供需与战略研究报告
  17. Oracle - Spool导出数据到TXT文件
  18. 滴滴公布自查进展:免去黄洁莉顺风车事业部总经理职务
  19. 强化学习中的递归神经网络
  20. Electron常见问题 3-Error: sha512 checksum mismatch, expected

热门文章

  1. re.sub对多处字符串进行替换
  2. Linux常用知识与命令
  3. js能判断当前字符串是一个完整单词吗_LeetCode30串联所有单词的子串31下一个排列...
  4. 蛮力法求最大字段和时间复杂度_中文分词算法之--最大匹配法
  5. thinkphp去重,distinct、group
  6. java configuration类_使用@Configuration编写自定义配置类
  7. JDBC09 CLOB文本大对象
  8. 下载centos(阿里云)
  9. zookeeper 与dubbo管理平台Window 安装与使用
  10. Ubuntu 14.04 desktop 不能安装 openssh-server解决方法