C++语言基础 —— STL —— 算法 —— 排列组合算法
【概述】
首先要了解什么是 “下一个” 排列组合,什么是 “上一个” 排列组合。
假设有三个数字组成的序列:{a,b,c}
则这个序列有6种可能的排列组合:abc、acb、bac、bca、cab、cba
上述的排列组合是根据 less-than 操作符做字典顺序的排序,即:abc 处于第一,每一个元素都小于其后的元素,而 acb 是次一个排列组合,它是固定了序列内最小元素( a )之后所做的新组合。
同理,序列中次小元素( b )而做的排列组合,在次序上将先于那些固定最小元素( c )而做的排列组合,以 bac、bca 为例,bac 在 bca 之前,因为次序 ac 小于序列 ca ,因此,对于 bca,可以说其前一个排列组合是 bac,其后一个排列组合是 cab。
要注意的是,处于排列首的序列 abc 没有 “前一个” 排列组合,处于排列尾的序列 cba 没有“后一个”排列组合。
【STL 中提供的算法】
STL 提供了两个用来计算排列组合关系的算法,分别是 next_permutation() 与 prev_permutation()
其中,next_permutation() 是取出当前范围内的排列,并重新排序为下一个排列,prev_permutation() 是取出指定范围内的序列并将它重新排序为上一个序列。如果不存在下一个序列或上一个序列则返回 false,否则返回 true
这个算法有两个版本,其一使用元素类别所提供的操作符来决定下一个或上一个排列组合,其二是以仿函数 comp 来决定
1.算法思想
以 next_permutation() 为例:
- 从最尾端开始向前寻找两个相邻的元素,令第一元素为 *i,第二元素为 *ii,且满足 *i<*ii
- 找到上述的一组相邻元素后,从最尾端向前检验,找出第一个大于 *i 的元素,令其为 *j,然后将 i、j 元素交换
- 再将 ii 之后的所有元素颠倒排序
假设存在序列{0,1,2,3,4},下图即为寻找全排列的过程
2.next_permutation() 的用法
对于给定的任意一种排列组合,如果能求出下一个排列的情况,那么求得所有全排列情况就容易了。
利用 next_permutation() 的返回值,通过判断排列是否结束,即可求出全排列。
int a[N];
void all_permutation(int n)
{sort(a,a+n);do{for(int i=0; i<n; i++)printf("%d ",a[i]);printf("\n");}while(next_permutation(a,a+n));
}
3.next_permutation() 与 prev_permutation() 的区别
next_permutation() 函数默认的是从小到大的顺序,而 prev_permutation() 函数默认的是从大到小的顺序。
例如:对于序列 {3,1,2}
用 next_permutation() 函数得到的结果是:312、321
用 prev_permutation() 函数得到的结果是:312、231、213、132、123
C++语言基础 —— STL —— 算法 —— 排列组合算法相关推荐
- c语言排列组合的函数,c语言排列组合算法 排列和组合算法的实现方法_C语言经典案例...
想了解排列和组合算法的实现方法_C语言经典案例的相关内容吗,在本文为您仔细讲解c语言排列组合算法的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:c语言排列组合算法,下面大家一起来学习吧. ...
- python 排列组合速度_Python实现的简单排列组合算法示例
本文实例讲述了Python实现的简单排列组合算法.分享给大家供大家参考,具体如下: 1.python语言简单.方便,其内部可以快速实现排列组合算法,下面做简单介绍 2.一个列表数据任意组合 主要是利用 ...
- python写排列组合_Python实现的简单排列组合算法示例
本文实例讲述了Python实现的简单排列组合算法.分享给大家供大家参考,具体如下: 1.python语言简单.方便,其内部可以快速实现排列组合算法,下面做简单介绍 2.一个列表数据任意组合 主要是利用 ...
- python 排列组合算法_基于python快速实现排列组合算法
1.python语言简单.方便,其内部可以快速实现排列组合算法,下面做简单介绍. 2.一个列表数据任意组合 2.1主要是利用自带的库#_*_ coding:utf-8 _*_ #__author__= ...
- 排列组合算法之二: 01转换法_java改变后的c++改进版
http://blog.csdn.net/canguanxihu/article/details/46363375 排列组合算法之一: 01转换法_java改变后的c++版 class ZuheAss ...
- 排列 组合 算法(一)
排列组合算法 我们都知道排列与组合的个数可以利用公式很容易的求出来,但是要是把这些排列组合的序列一一输出怎么办呢? 下面结合<组合数学>(第四版)卢开澄卢华明编著,好好总结排列与组合的算法 ...
- java 获取排列组合_Java获得一个数组的指定长度排列组合算法示例
本文实例讲述了Java获得一个数组的指定长度排列组合算法.分享给大家供大家参考,具体如下: package demo; import java.util.Stack; /** * JAVA获得一个数组 ...
- js排列组合算法解决方案
之前文章中谈过排列组合算法,主要事递归,代码如下 const arrangeCombination = arr => {const res = [], len = arr.length, inn ...
- C#语法灵活运用之排列组合算法
今天群里有朋友求一个排列组合算法,题目是给定长度,输出所有指定字母的组合. 如指定字母a.b.c.d.e.f,长度为2,则结果应为:aa.ab.ac ... ef.ff. 有朋友给出算法,很有特色: ...
最新文章
- Chrome浏览器禁止缓存
- 学python用什么软件开发-5款Python程序员高频使用开发工具推荐
- 【九度OJ】题目1078-二叉树遍历
- Spring Cloud中,Eureka常见问题总结
- no acceptable C compiler found in $PATH
- Shell(bash) 介绍
- LeetCode篇之链表:1290(二进制链表转整数)
- javascript encodeURI和encodeURIComponent的比较
- jeval 公式_几款公式解析工具的比较
- python姿态识别_基于深度学习的人体姿态识别算法总结
- 南宁:“数字城管”让智慧城市建设提质提速
- 零基础学SQL(一、数据库与SQL简介)
- 对抗神经网络学习(简单的理解)
- 非常适合新手入门学习的三款建模软件
- thinkpad T480安装WIN7系统NVM固态硬盘+INTEL HD620显卡
- web开发路径问题解决
- Lake Shore—224 型温度监测器
- QtreeWidget添加右键菜单
- Spring Cloud Hystrix 全解 (1) - 总览篇
- **京东撸货是什么,京东撸货具体怎么玩,能不能赚钱,我来告诉你**