排列生成算法实现java
来源:互联网 发布:淘宝手机怎么添加分类 编辑:程序博客网 时间:2024/06/05 15:39
排列生成算法是常用的算法之一,详细的介绍请查考《组合数学》教材。
1.序数法
序数思想来源于数字的表示形式
对于任何给定小于10的m次方的正整数N,我们可以表示为如下形式:
N= a0×10^0+...+a(m-1)×10^(m-1)
也就是说N可以唯一的表示为(a0,..., a(m-1))
同理对于任何属于0~(n!-1)的正整数m 我们可以唯一的表示为
m=a(n-1)*(n-1)!+...+a1*1!
这样给定整数m我们可以唯一的表示为(a(n-1),...,a1)
对于以上的计算,显而易见了。
对于任何一个排列p1,p2,p3,...,pn
ai可以看作是排列p中i+1所在的位置比较i+1小的数的个数。
例如:4213,4右边的比4小的数为3,则a3=3,同理可得
p=(4212)可以表示为(301)
反过来我们可以通过301得到4213。
具体参照《组合数学》
由此可以对于数序算法的核心主要包括两个
一是如何把一个整数映射到一个元素序数
二是对序数的解码
对于算法的实现,如下:
package recursive;import java.util.ArrayList;import java.util.HashMap;import java.util.List;public class Perm {public ArrayList ordinalPerm(String input) {int lenght = input.length();int num = caculatePerm(lenght);ArrayList al = new ArrayList();for (int i = 0; i < num; i++) {String code = num2ordinal(i, lenght - 1);al.add(decode(code, input));}return al;}// decodeprivate String decode(String code, String input) {int[] tag = new int[code.length() + 1];char[] content = new char[code.length() + 1];for (int i = 0; i < code.length(); i++) {int pos = Integer.parseInt(code.charAt(i) + "");char temp = input.charAt(input.length() - 1 - i);int ept = 0;int index = 0;// locate the position of new character// count the empty slotfor (int j = tag.length - 1; j >= 0; j--) {if (ept == pos && tag[j] != 1) {index = j;break;} else {if (tag[j] != 1)ept++;}}content[index] = temp;tag[index] = 1;}for (int i = 0; i < tag.length; i++) {if (tag[i] == 0)content[i] = input.charAt(0);}String result = "";for (int i = 0; i < content.length; i++) {result += content[i];}return result;}private String num2ordinal(int k, int lenght) {String s = "";for (int i = 0; i < lenght; i++) {s = k % (i + 2) + s;k = k / (i + 2);}return s;}// the num of permutationprivate int caculatePerm(int n) {if (n <= 1) {return 1;} else {int perm = 1;for (int i = n; i >= 1; i--) {perm *= i;}return perm;}}}input:1234output:如下00001234100121342010132430112314402031245021321461001243710121438110134291112341101203142111213241122001423132012413142101432152112431162203412172213421183004123193014213203104132213114231223204312233214321
- 排列生成算法实现java
- 全排列生成算法java实现
- 归纳法-生成全排列算法Java实现
- 排列的生成算法 换位算法实现
- 全排列算法(Java实现)
- 全排列算法【java实现】
- 全排列算法java实现
- Java 实现全排列算法
- 全排列算法Java实现
- 生成排列的非递归实现算法
- 算法java实现--回溯法--圆排列问题--排列树
- 生成排列算法
- 排列生成算法
- 排列生成算法
- 全排列生成算法
- 全排列生成算法 .
- 全排列生成算法
- 算法 生成随机排列
- android GridView,Gallery,ListView 【安卓进化六】
- NBA 2K11键盘按键操作介绍
- second essay
- PHP 语法
- css框架[3]-960grids
- 排列生成算法实现java
- Mongo linux下开机自启动,启动服务等
- PHP 变量
- C# Socket.send阻塞
- PHP 字符串
- PHP 运算符
- 用C语言的rand()和srand()产生伪随机数的方法总结
- C/C++中产生随机数(rand,srand用法)
- PHP If...Else 语句