全排列算法问全排列公式解释

全排列算法  时间:2021-08-31  阅读:()

求遍历全排列的算法

全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。

常见的有四种全排列算法: (A)字典序法 (B)递增进位制数法 (C)递减进位制数法 (D)邻位对换法 这里着重介绍字典序法 对给定的字符集中的字符规定了一个先后关系,在此基础上规定两个全排列的先后是从左到右逐个比较对应的字符的先后。

[例]字符集{1,2,3},较小的数字较先,这样按字典序生成的全排列是:123,132,213,231,312,321。

[注意] 一个全排列可看做一个字符串,字符串可有前缀、后缀。

1)生成给定全排列的下一个排列 所谓一个的下一个就是这一个与下一个之间没有其他的。

这就要求这一个与下一个有尽可能长的共同前缀,也即变化限制在尽可能短的后缀上。

[例]839647521是1--9的排列。

1—9的排列最前面的是123456789,最后面的是987654321,从右向左扫描若都是增的,就到了987654321,也就没有下一个了。

否则找出第一次出现下降的位置。

谁知C++求全排列的算法

#include <iostream> #include <string> #include <list> using namespace std; string slist=""; string sresult=""; int listlen=0; int ex=0; string permute(string list) { string strreturn=""; int ln=list.length(); if( ln==2 ) { strreturn=list; char temp; temp=list[0]; list[0]=list[1]; list[1]=temp; return strreturn+list; } string substr=""; string strtemp=""; for(int i=0; i<ln; ++i) { strtemp.clear(); substr.clear(); if( i>0 ) substr += list.substr(0,i); if( i<ln-1 ) substr += list.substr(i+1, ln-1); int lntemp=ln-1; long FN=lntemp; while( --lntemp!=1 ) FN*=lntemp; lntemp=ln-1; string str=permute(substr); for(int j=0; j<FN; ++j) { strtemp += list[i]+str.substr(j*lntemp, lntemp); } strreturn += strtemp; } return strreturn; } int main() { cout<<"Enter the characters to permute: "; getline(cin, slist); listlen = slist.length()-1; slist = slist.substr(0, listlen); sresult=permute(slist); int lntemp=listlen; long FN=lntemp; while( --lntemp!=1 ) FN*=lntemp; //排除有3个连续字母的... string str=""; lntemp=listlen; for(int i=0; i<FN; ++i) { str=sresult.substr(i*lntemp, lntemp); for( int j=0; j<lntemp-2; ++j ) { if( str[j]==str[j+1]-1 && str[j+1]==str[j+2]-1 ) { sresult.erase( i*lntemp, lntemp ); //删除之 --i; --FN; cout<<str<<"..."; //显示被排除的排列 break; } } } cout<<endl; for(int i=0; i<FN; ++i) { str=sresult.substr(i*lntemp, lntemp); cout<<str<<"..."; } cout<<FN<<endl; //符合要求的排列数 }

java 全排列算法;

= =~思路什么的...用递归吧: package mon_11; import java.util.HashSet; public class ArrangeAll { private static HashSet<String> set = new HashSet<String>(); public static void arrangeAll(String s) { put(new StringBuilder(s), new StringBuilder()); } static void put(StringBuilder s1, StringBuilder s2) { if (s1.length() == 0)set.add(s2.toString()); for (int i = 0; i < s1.length(); i++) { put(new StringBuilder(s1).deleteCharAt(i),new StringBuilder(s2).append(s1.charAt(i))); } } public static void main(String[] args) { arrangeAll("abcd"); System.out.println(set); } } ---- 输出: [dcab, acdb, acbd, bcda, bdca, bdac, dbca, bacd, cabd, cdba, cdab, badc, dabc, cadb, dbac, bcad, dacb, cbda, cbad, adbc, adcb, abcd, abdc, dcba]

问全排列公式解释

可以这样解释: 第一次取球有8种可能,我们放在第一位; 第二次取球有7种可能(因为第一次已取走一个),我们放在第二位; 第三次取球有6种肯能(因为前两次已取走两个),我们放在第三位; 所以共有8*7*6种排列方法。

但是我们只要求球不同,而位置没要求, 那么三个位置,相同的一组三个球,有几种排列呢,6种,分别为: 1,2,3; 1,3,2; 2,1,3; 2,3,1; 3,1,2; 3,2,1。

所以如果不要求位置,三个球的组合为8*7*6/6=56。

如果是排列P83=8!/5!; 而组合是C83=P!/3! 不知我说明白了吗?

小欢互联19元/月起, 即日起至10月底 美国CERA 促销活动 美国/香港八折

小欢互联成立于2019年10月,主打海外高性价比云服务器、CDN和虚拟主机服务。近期上线了自营美国CERA机房高速VPS,进行促销活动,为客户奉上美国/香港八折优惠码:Xxc1mtLB优惠码适用于美国CERA一区/二区以及香港一区/二区优惠时间:即日起至10月底优惠码可无限次使用,且续费同价!官网:https://idc.xh-ws.com购买地址:美国CERA一区:https://idc.xh-...

GreenCloudVPS$20/年多国机房可选,1核@Ryzen 3950x/1GB内存/30GB NVMe/10Gbps端口月流量2TB

GreencloudVPS此次在四个机房都上线10Gbps大带宽VPS,并且全部采用AMD处理器,其中美国芝加哥机房采用Ryzen 3950x处理器,新加坡、荷兰阿姆斯特丹、美国杰克逊维尔机房采用Ryzen 3960x处理器,全部都是RAID-1 NVMe硬盘、DDR4 2666Mhz内存,GreenCloudVPS本次促销的便宜VPS最低仅需20美元/年,支持支付宝、银联和paypal。Gree...

LightNode($7.71/月)香港cn2精品线路

LightNode官网LightNode是一家位于香港的VPS服务商.提供基于KVM虚拟化技术的VPS.在提供全球常见节点的同时,还具备东南亚地区、中国香港等边缘节点.满足开发者建站,游戏应用,外贸电商等应用场景的需求。为用户带来高性能服务器以及优质的服务的同时还提供丰厚的促销活动,新用户注册最高送$20。注册用户带新客即可得10%返佣。商家支持PayPal,支付宝等支付方式。官网:https:/...

全排列算法为你推荐
开发管理什么是项目管理校园网络拓扑图网吧拓扑图和校园网拓扑图一样啊?说明书之家网站哪里有SONY专业摄像机的使用说明书封包是什么灰指甲封包治疗是什么,真的管用吗?解码器有什么用视频编码器和视频解码器有什么不同网络黑科技华为有哪些黑科技?信息发布管理系统信息发布系统的构架区别怎样下载文件QQ上发过来的文件怎么下载不了red5集群JAVA服务集群与非集群的区别?wps表格数据恢复WPS表格如果变成这样怎么恢复
查询域名 sugarsync paypal认证 iisphpmysql 国外代理服务器地址 申请免费空间和域名 七夕快乐英语 根服务器 服务器防火墙 注册阿里云邮箱 免费个人网页 电信宽带测速软件 广东主机托管 ssl加速 中国电信宽带测速 wordpress空间 godaddy域名 美国西雅图独立 天鹰抗ddos防火墙 主机箱 更多