获取所有组合算法、获取全排列算法(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算法之前,有必要详 ...
随机推荐
- less的使用方法
LESS学习 1.变量 我们可以把一个css样式的值赋给一个参数,然后再设置样式的时候只需要设置这个参数名,如果要修改,就改参数的值就可以了. demo.html <!DOCTYPE html& ...
- Mysql,Oracle,Java数据类型对应
Mysql Oracle Java BIGINT NUMBER(19,0) java.lang.Long BIT RAW byte[] BLOB BLOB RAW byte[] CHAR CHAR j ...
- DB天气app冲刺第二天
烦躁 烦躁 很烦躁 从大早起就想做一个listview的列表 到晚上也没有做好.不知道为什么.决定明天去问问同学 .做不出来太影响心情了.虽然做出来东西的感觉是很好.. 另外觉得真的没有队友是挺孤独. ...
- winform 项目获取app.config 中appSettings节点数据
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSe ...
- python机器学习库
http://scikit-learn.org/stable/install.html
- 关于table的一些兼容性问题
不多说,先来看两个常用的简单效果 ---- 兼容拼比一(普通边线效果) 图一:谷歌.火狐.ie8+下 图二:ie6/7下 从图中看出,ie6/7其实是不认识tr边框线的,,所以平时做项目时候,我们一般 ...
- 聊聊 Statsd 和 Collectd 那点事!
StatsD 是由 Etsy 开发并发布的汇总和总结应用指标的一个简单的守护进程,近些年来发展迅速,已经变成了一个用于收集应用性能指标的统一的协议. 关于 Statsd 的使用已经有很多文章介绍过,所 ...
- Android(安卓)系统USB-OTG-HID外设通讯开发
正在为客户开发的X射线荧光成分分析仪(简称手持XRF分析仪 ),采用了MT6577 Android方案来开发.其中负责发送X射线的X-Ray-Tube设备是通过USB口来控制的.为了完成控制,就要求我 ...
- Android Binder设计与实现 - 设计篇
要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder具 ...
- !! python 之半年总结
http://blog.chinaunix.net/uid-26443921-id-3481357.html 半年前开始系统完整深入的了解学习 python 读书篇: <python 核心编程2 ...