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

全排列算法  时间: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! 不知我说明白了吗?

ZJI-全场八折优惠,香港服务器 600元起,还有日本/美国/韩国服务器

ZJI怎么样?ZJI是一家成立于2011年的商家,原名维翔主机,主要从事独立服务器产品销售,目前主打中国香港、日本、美国独立服务器产品,是一个稳定、靠谱的老牌商家。详情如下:月付/年付优惠码:zji??下物理服务器/VDS/虚拟主机空间订单八折终身优惠(长期有效)一、ZJI官网点击直达香港葵湾特惠B型 CPU:E5-2650L核心:6核12线程内存:16GB硬盘:480GB SSD带宽:5Mbps...

美国服务器20G防御 50G防御 688元CN2回国

全球领先的IDC服务商华纳云“美国服务器”正式发售啦~~~~此次上线的美国服务器包含美国云服务器、美国服务器、美国高防服务器以及美国高防云服务器。针对此次美国服务器新品上线,华纳云也推出了史无前例的超低活动力度。美国云服务器低至3折,1核1G5M低至24元/月,20G DDos防御的美国服务器低至688元/月,年付再送2个月,两年送4个月,三年送6个月,且永久续费同价,更多款高性价比配置供您选择。...

香港站群多ip服务器多少钱?零途云香港站群云服务器怎么样?

香港站群多ip服务器多少钱?想做好站群的SEO优化,最好给每个网站都分配一个独立IP,这样每个网站之间才不会受到影响。对做站群的站长来说,租用一家性价比高且提供多IP的香港多ip站群服务器很有必要。零途云推出的香港多ip站群云服务器多达256个IP,可以满足站群的优化需求,而且性价比非常高。那么,香港多ip站群云服务器价格多少钱一个月?选择什么样的香港多IP站群云服务器比较好呢?今天,小编带大家一...

全排列算法为你推荐
网络的好处网络的好处作文测量师三坐标测量师工资多少混乱模式拳皇2002的李梅怎么进入混乱模式?网站数据分析报告网站流量统计分析的页面浏览数分析零终端银行卡圈存是什么意思价格咨询造价咨询公司收费标准是按公司给还是按个人给?反恐精英维护到几点反恐精英几点维护完2017双112017双十一晚会播出时间,2017双11晚会举办城市宽带包月宽带可以按月办吗网站建设简介网站建设一般都包括哪些内容?有哪些细节是特别需要注意的吗?
国内域名注册 cn域名个人注册 wavecom 香港新世界电讯 国外空间 12306抢票助手 有益网络 91vps metalink 银盘服务 1元域名 免费的asp空间 东莞主机托管 免费asp空间申请 阿里云邮箱登陆 睿云 博客域名 shuangcheng 百度新闻源申请 windowsserver2012 更多