全排列算法问全排列公式解释
全排列算法 时间: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! 不知我说明白了吗?
享有云怎么样?享有云是一家新的国内云服务器商家,目前提供国内、香港及海外地区的云服务器,拥有多线路如:BGP线路、CN2线路、高防等云服务器,并且提供稳定、安全、弹性、高性能的云端计算服务,实时满足您的多样性业务需求。目前,美国bgp云服务器,5M带宽,低至20元/月起,270元/年起,首月打折;香港2核2G2M仅50元/月起,450元/年起!点击进入:享有云官方网站地址享有云优惠活动:一、美国B...
LOCVPS怎么样?LOCVPS是一家成立于2011年的稳定老牌国人商家,目前提供中国香港、韩国、美国、日本、新加坡、德国、荷兰等区域VPS服务器,所有机房Ping延迟低,国内速度优秀,非常适合建站和远程办公,所有机房Ping延迟低,国内速度优秀,非常适合做站。XEN架构产品的特点是小带宽无限流量、不超售!KVM架构是目前比较流行的虚拟化技术,大带宽,生态发展比较全面!所有大家可以根据自己业务需求...
ZJI是成立于2011年原Wordpress圈知名主机商—维翔主机,2018年9月更名为ZJI,主要提供香港、日本、美国独立服务器(自营/数据中心直营)租用及VDS、虚拟主机空间、域名注册业务。本月商家针对香港阿里云线路独立服务器提供月付立减270-400元优惠码,优惠后香港独立服务器(阿里云专线)E3或者E5 CPU,SSD硬盘,最低每月仅480元起。阿里一型CPU:Intel E5-2630L...
全排列算法为你推荐
accesspoint接入点APN什么意思啊色空间相机、PS里色彩空间该怎样设置?化学键理论什么是化学键?化学键是怎样形成的?哪些物质有化学键?那些没有?化学键理论关于化学键的知识化学键理论价键理论和分子轨道理论的主要区别是什么化学键理论化学键的定义反恐精英维护到几点反恐精英几点维护完最新汽车电子产品当今的电子产品都有哪些分类?什么是无线上网什么是宽带?什么是无线上网?什么是网线?什么是无线上网无线网络是什么意思
bandwagonhost inmotionhosting 精品网 免费cdn加速 速度云 nerds 可外链网盘 免费私人服务器 申请网站 vul 美国盐湖城 什么是web服务器 服务器防火墙 睿云 japanese50m咸熟 第八届中美互联网论坛 美国十大啦 卡巴斯基免费版下载 shuangshiyi 免费php空间申请 更多