获取所有组合算法、获取全排列算法(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算法之前,有必要详 ...
随机推荐
- Objective-c开发中混合使用ARC
首选“Compile Sources”的位置: 选中工程->TARGETS->相应的target然后选中右侧的“Build Phases”,向下就找到“Compile Sources”了. ...
- Memcached(五)Memcached的并发实例
package com.sinosuperman.memcached; import java.io.IOException; import java.net.InetSocketAddress; i ...
- gdb在Mac上的安装步骤
到gdb官网下载gdb安装包,解压后,在“终端”中进入其目录:然后依次执行如下命令行: 1st:CFLAGS='-Wno-string-plus-int -g -O2' ./configure --d ...
- 网页上PNG透明图片的ie6bug
只有IE6有这个Bug,所以的写法这样就可以了 #png{background:url(../images/png32.png) no-repeat;_filter:progid:DXImageTra ...
- 【弱省胡策】Round #6 String 解题报告
感觉这个题好神啊. 首先我们只管 $a = b$ 的情况,那么我们自然就可以把这个串对 $a$ 取模,然后用 KMP 求出能弄出几个其他的 B 串. 具体就是把串先倍长,然后倒过来,然后求 $Next ...
- WCF 消息压缩性能问题及解决方法
最近使用WCF作为通迅框架开发一套信息系统,系统使用传统C/S框架,系统有可能会部署在互联网上,因此决定对传输的数据进行GZIP压缩,原来在使用.NET Remoting时,可以使用插入自定义的Cha ...
- configure脚本参数介绍
configure脚本有大量的命令行选项. 下面对每一个选项进行简略的介绍: --cache-file=FILE'configure' 会在你的系统上测试存在的特性(或者bug!).为了加速随后进行的 ...
- Java 单链表逆序
代码: package com.wangzhu.linkedlist; public class LinkedListDemo { /** * @param args */ public static ...
- [wikioi]线段覆盖
http://wikioi.com/problem/1214/ 这道题也归为贪心了.我也不是很能分辨,但想法确实是:1.有阶段最优化性:2.前一状态和后一状态有关系. 想法:1.排个序是很自然的想法, ...
- protel dxp快捷键大全
enter——选取或启动 esc——放弃或取消f1——启动在线帮助窗口tab——启动浮动图件的属性窗口pgup——放大窗口显示比例pgdn——缩小窗口显示比例end——刷新屏幕del——删除点取的元件 ...