全排列算法问全排列公式解释
全排列算法 时间: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! 不知我说明白了吗?
Virmach 商家算是比较久且一直在低价便宜VPS方案中玩的不亦乐乎的商家,有很多同时期的商家纷纷关闭转让,也有的转型到中高端用户。而前一段时间也有分享过一次Virmach商家推出所谓的一次性便宜VPS主机,比如很低的价格半年时间,时间到服务器也就关闭。这不今天又看到商家有提供这样的产品。这次的活动产品包括圣何塞和水牛城两个机房,为期六个月,一次性付费用完将会取消,就这么特别的产品,适合短期玩玩...
RAKsmart怎么样?RAKsmart是一家由华人运营的国外主机商,提供的产品包括独立服务器租用和VPS等,可选数据中心包括美国加州圣何塞、洛杉矶、中国香港、韩国、日本、荷兰等国家和地区数据中心(部分自营),支持使用PayPal、支付宝等付款方式,网站可选中文网页,提供中文客服支持。本月商家继续提供每日限量秒杀服务器月付30.62美元起,除了常规服务器外,商家美国/韩国/日本站群服务器、1-10...
spinservers怎么样?spinservers大硬盘服务器。Spinservers刚刚在美国圣何塞机房补货120台独立服务器,CPU都是双E5系列,64-512GB DDR4内存,超大SSD或NVMe存储,数量有限,机器都是预部署好的,下单即可上架,无需人工干预,有需要的朋友抓紧下单哦。Spinservers是Majestic Hosting Solutions,LLC旗下站点,主营美国独立...
全排列算法为你推荐
权限表用户,权限,角色表怎么设计文件保护文件被写保护,怎么解除/文件保护我的电脑总是出现“windows文件保护u盾证书转款叫我下载U盾证书,是什么意思测量师测量师考什么java教程pdfJava操作pdf表格数据2g内存条电脑2G内存够用吗?最好的电脑操作系统电脑系统哪个比较好用,运行流畅?上海网络维护公司上海博好网络科技有限公司的介绍锤子手机发布会视频锤子手机怎么样 锤子手机评测
万网域名查询 域名空间购买 免费申请网页 t楼 国外bt iisphpmysql 服务器cpu性能排行 申请空间 牛人与腾讯客服对话 e蜗牛 qq数据库下载 卡巴斯基官方免费版 北京双线机房 183是联通还是移动 512mb 外贸空间 杭州电信宽带 聚惠网 japanese50m咸熟 蓝队云 更多