获取所有组合算法、获取全排列算法(java)
转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5574516.html
受到ACM1015的影响,个人感觉,有必要对统计学上的 全组合和全排列 进行一个简单的总结
组合数:从m个不同元素中取出n(n≤m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数(Combination)。
如1,2,3三个元素的全组合为:
1
2
3
12
13
23
123

以下是java实现的获取全组合及其个数的算法:
import java.io.BufferedInputStream;
import java.util.ArrayList;
import java.util.Scanner; public class GetCombination { public static void main(String[] args) {
Scanner scan = new Scanner(new BufferedInputStream(System.in));
String s = scan.next();
ArrayList<String> list = new ArrayList<>();
ArrayList<Character> com = new ArrayList<>();
int len = s.length() + 1;
for(int i = 1 ; i != len ; i ++){
getCombinations(list,s.toCharArray(),0,i,com);
}
for(int i = 0 ; i != list.size() ; i ++){
System.out.println(list.get(i));
}
System.out.println(getCountOfCombinations(s.length(),s.length()));
scan.close();
} static void getCombinations(ArrayList<String> list ,char[] cs, int start,int len,ArrayList<Character> com){//len为组合的长度
if(len == 0){
String s = "";
for(int i = 0 ; i != com.size() ; i ++){
s = s.concat(com.get(i).toString());
}
list.add(s);
return;
}
if(start==cs.length){
return;
}
com.add(cs[start]);
getCombinations(list,cs,start+1,len-1,com);
com.remove(com.size()-1);
getCombinations(list,cs,start+1,len,com);
} static int getCountOfCombinations(int arrLen,int len){//获取长度为len的组合数
int m = 1;
for(int i = 0 ; i != len ; i ++ ){
m*=arrLen-i;
}
int n = 1;
for(int i = len ; i != 1 ; i --){
n*=i;
}
return m/n;
} }
全排列:从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。
如1,2,3三个元素的全排列为:
1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1
共3*2*1=6种 3!

以下是java实现的获取全排列及其个数的算法:
import java.io.BufferedInputStream;
import java.util.ArrayList;
import java.util.Scanner; public class GetAllPermutations { public static void main(String[] args) {
Scanner scan = new Scanner(new BufferedInputStream(System.in));
String s = scan.next();
ArrayList<String> list = new ArrayList<>();
getAllPermutations(list,s.toCharArray(),0,s.length());
System.out.println("----------非字典序----------");
for(int i = 0 ; i != list.size() ; i ++){
System.out.println(list.get(i));
}
list.clear();
System.out.println("----------字典序----------");
getAllPermutations2(list,s.toCharArray(),0,s.length());
for(int i = 0 ; i != list.size() ; i ++){
System.out.println(list.get(i));
}
System.out.println(getCountOfAllPermutations(s.toCharArray(),0,s.length()));
scan.close();
} static int getCountOfAllPermutations(char[] cs,int start,int len){//start为数组序号
int count = 1;
int n = start + len ;
for(int i = start ; i != n ; i ++ ){
count *= i+1;
}
return count;
} //非字典序
static void getAllPermutations(ArrayList<String> answers,char[] cs,int start,int len){
if(start == len ){
answers.add(String.valueOf(cs));
return;
}
for(int i = start ; i != len ; i ++){
swap(cs,i,start);
getAllPermutations(answers,cs,start+1,len);
swap(cs,i,start);
}
} //字典序
static void getAllPermutations2(ArrayList<String> list, char[] cs, int i, int length) {
sort(cs);
permutations(list,cs,i,length);
} static void sort(char[] a) {//对字符数组进行快排
int len = a.length;
int low = 0,high = len - 1;
quickSort(a, low, high);
} static void quickSort(char[] a, int l ,int h){
if(l>=h){
return;
}
int low = l;
int high = h;
char k = a[low];
while(low< high){
//
while(high>low&&a[high]>=k){//寻找元素右边比其小的
high --;
}
a[low] = a[high];//进行交换,K指向high
while(low<high&&a[low]<=k){//寻找元素左边比其大的
low++;
}
a[high] = a[low];//进行交换,K指向low
}
a[low] = k;//将K赋给low
quickSort(a, l, low-1);
quickSort(a, low+1, h);
} static void permutations(ArrayList<String> answers,char[] cs,int start,int len){//cs为字典序数组
if(cs==null)
return;
while(true)
{
answers.add(String.valueOf(cs));
int j=start+len-2,k=start+len-1;
while(j>=start && cs[j]>cs[j+1])
--j;
if(j<start)
break; while(cs[k]<cs[j])
--k; swap(cs,k,j); int a,b;
for(a=j+1,b=start+len-1;a<b;++a,--b)
{
swap(cs,a,b);
}
}
} static void swap(char[] cs , int i , int j){
char t;
t = cs[i];
cs[i] = cs[j];
cs[j] = t;
}
}
获取所有组合算法、获取全排列算法(java)的更多相关文章
- 元素操作(sizing,尺寸获取,设值,偏移算法,坐标算法)
css3的Sizing Box-sizing是css3的box属性之一,遵循css的boxmodel原理,css中box model是分为两种,第一种是w3c的标准模型,另一种是ie的传统模型,他们相 ...
- 基于uFUN开发板的心率计(二)动态阈值算法获取心率值
前言 上一篇文章:基于uFUN开发板的心率计(一)DMA方式获取传感器数据,介绍了如何获取PulseSensor心率传感器的电压值,并对硬件电路进行了计算分析.心率计,重要的是要获取到心率值,本篇文章 ...
- 全排列算法--递归实现(Java)
求一个n阶行列式,一个比较简单的方法就是使用全排列的方法,那么简述以下全排列算法的递归实现. 首先举一个简单的例子说明算法的原理,既然是递归,首先说明一下出口条件.以[1, 2]为例 首先展示一下主要 ...
- 最短路径算法之Dijkstra算法(java实现)
前言 Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知 ...
- 算法 《秦九韶算法java实践》
[历史背景] 秦九韶算法是中国南宋时期的数学家秦九韶表述求解一元高次多项式的值的算法--正负开方术.它也能够配合牛顿法用来求解一元高次多项式的根.在西方被称作霍纳算法(Horner algorithm ...
- 算法笔记_066:Kruskal算法详解(Java)
目录 1 问题描述 2 解决方案 2.1 构造最小生成树示例 2.2 伪码及时间效率分析 2.3 具体编码(最佳时间效率) 1 问题描述 何为Kruskal算法? 该算法功能:求取加权连通图的最小 ...
- AES算法,DES算法,RSA算法JAVA实现
1 AES算法 1.1 算法描述 1.1.1 设计思想 Rijndael密码的设计力求满足以下3条标准: ① 抵抗所有已知的攻击. ② 在多个平台上速度快,编码紧凑. ③ 设计 ...
- 算法笔记_071:SPFA算法简单介绍(Java)
目录 1 问题描述 2 解决方案 2.1 具体编码 1 问题描述 何为spfa(Shortest Path Faster Algorithm)算法? spfa算法功能:给定一个加权连通图,选取一个 ...
- 原创:Kmeans算法实战+改进(java实现)
kmeans算法的流程: EM思想很伟大,在处理含有隐式变量的机器学习算法中很有用.聚类算法包括kmeans,高斯混合聚类,快速迭代聚类等等,都离不开EM思想.在了解kmeans算法之前,有必要详 ...
随机推荐
- Kinetic使用注意点--canvas
<virtual> new Canvas(width, height) 参数: width:canvas宽度 height:canvas高度 方法: applyShadow(shape, ...
- ios字符串操作
string的操作应用 NSRange range = [self.general rangeOfString:@"."]; NSString *str = [self.gener ...
- 几种C#实现播放声音的方法
在这里介绍使用C#实现播放声音的几种方法,都是利用组件等方法来实现的,有兴趣的话可以看下. 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroS ...
- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试]:谢勤政-11061197,吴润凡-11061185
一,关于结对编程 结对编程的优点: 1)在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力. 2)对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高 ...
- 服务器环境搭建系列(二)-Tomcat篇
1.解压缩Tomcat的tar包,默认放在opt下 tar -zxvf apache-tomcat-6.0.35.tar.gz 2.输入如下命令修改tomcat配置文件 vi /opt/apache- ...
- [转载]C# 中对html 标签过滤
private string FilterHTML(string html) { System.Text.RegularExpressions.Regex regex1 = new System.Te ...
- mysql中实现行号,oracle中的rowid
mysql中实现行号需要用到MYSQL的变量,因为MySql木有rownumber. MYSQL中变量定义可以用 set @var=0 或 set @var:=0 可以用=或:=都可以,但是如果变量用 ...
- 年度十佳 DevOps 博客文章(前篇)
如果说 15 年你还没有将 DevOps 真正应用起来,16 年再不实践也未免太落伍了.国内 ITOM 领军企业 OneAPM 工程师为您翻译整理了,2015 年十佳 DevOps 文章,究竟是不是深 ...
- android一个纠结的VFY错误
08-16 09:06:45.018: W/dalvikvm(2286): VFY: unable to resolve static method 3273: Lorg/slf4j/LoggerFa ...
- 【Uva11212】 Editing a Book(IDA*)
[题意] 有n个数字的全排列,每次可以剪切一段粘贴到某个位置.问最后变成升序最少多少步. 如"{2,4,1,5,3,6}要2步 {3,4,5,1,2}只要一步 [分析] 迭代深搜真的AC了也 ...