博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
排列组合算法
阅读量:7106 次
发布时间:2019-06-28

本文共 2265 字,大约阅读时间需要 7 分钟。

    排列:从n个不同元素中,任取m(m<=n)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m<=n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号A(n,m)表示。 A(n,m)=n(n-1)(n-2)……(n-m+1)= n!/(n-m)! 此外规定0!=1

    组合:从n个不同元素中,任取m(m<=n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m<=n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号C(n,m) 表示。 C(n,m)=A(n,m)/m!=n!/((n-m)!*m!);  C(n,m)=C(n,n-m)。

C语言使用标志位实现

#include 
using namespace std;#define MaxN 10char used[MaxN];int p[MaxN];char s[MaxN];//从n个元素中选r个进行排列void permute(int pos,const int n,const int r){ int i; /*如果已是第r个元素了,则可打印r个元素的排列 */ if(pos == r) { for(i=0; i

排列组合算法的递归实现:

#include 
using namespace std;template
void permute(Type a[], int start, int end){ if(start == end) { for(int i = 0; i <= end; ++i) { cout<
<<" "; } cout<
void combine(Type a[], bool b[], int start, int end){ if(start > end) { for(int i = 0; i <= end; ++i) { if(b[i]) cout<
<<" "; } cout<

排列算法的迭代实现

C++ STL中提供了和算法。因为和实际上是一样的,因此只描述算法。next_permutation()函数的作用是取下一个排列组合。考虑{a,b,c}的全排列:abc,acb,bac,bca,cab,cba,以“bac”作为参考,那么next_permutation()所得到的下一个排列组合是bca,prev_permutation()所得到的前一个排列组合是“acb”,之于“前一个”和“后一个”,是按字典进行排序的。

next_permutation()算法描述:

  1. 从str的尾端开始逆着寻找相邻的元素,*i和*ii,满足*i<*ii;
  2. 接着,又从str的尾端开始逆着寻找一元素,*j,满足*i>*j(*i从步骤一中得到);
  3. swap(*i,*j);
  4. 将*ii之后(包括*ii)的所有元素逆转。

举个例子,需要找到“01324”的下一个排列,找到*i=2,*ii=4,*j=4,下一个排列即“01342”。再来找到“abfedc”的下一个排列,找到*i=b,*ii=f,*j=c,swap操作过后为“acfedb”,逆转操作过后为“acbdef”。

//求阶乘int factorial(int n){    if(n == 1)  return 1;    return n*factorial(n-1);}template 
void print(Type a, int n){ for(int i = 0; i < n; ++i) cout<
<<" "; cout<
void perm2(Type a, int n){ int i,ii,j; int cnt = 1; print(a,n); int num = factorial(n); // STL
next_permutation()函数的核心算法 while(++cnt <= num) { i = n - 2; ii = n - 1; j = ii; while(a[i] >= a[ii]) --i,--ii; //find *i and *ii while(a[i] >= a[j]) --j; //find *j swap(a[i],a[j]); //STL swap reverse(a+ii,a+n); //STL reverse print(a,n); }}

 

转载地址:http://bjvhl.baihongyu.com/

你可能感兴趣的文章
eclipse汉化经验
查看>>
CentOS 6.5修改JDK环境
查看>>
求三位数对称素数
查看>>
移动端图片放大滑动查看-插件photoswipe的使用
查看>>
常用DOS命令,程序员的帮手
查看>>
Linux 安装 Apache web服务器
查看>>
struts2 遇到的问题 2
查看>>
Java问答:终极父类(3)
查看>>
彻底搞定Android开发中软键盘的常见问题
查看>>
Java使用RandomAccessFile读写文件
查看>>
程序员学习能力提升三要素
查看>>
《Java8实战》笔记-1.2.2传递代码:一个例子
查看>>
IDEA注册机
查看>>
微信APP支付 ,App无法调起微信
查看>>
Spring boot 内嵌tomcat,临时目录不存在 错误
查看>>
fedora16中virtualbox无法启动xp虚假机
查看>>
(十五)用JAVA编写MP3解码器——音频输出
查看>>
MyClouds开发指南》第1章 MyClouds微服务治理及快速开发平台简介
查看>>
用JDK制作可能运行的JAR
查看>>
开发人员如何转型做产品经理
查看>>