`
Stream.Town
  • 浏览: 23829 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

一个全排列算法题的Java实现

    博客分类:
  • Java
阅读更多
  今天在上网时偶然遇到一个算法问题,原文在这里:http://blog.csdn.net/mdj_bj/article/details/7792223
题目是用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。
 
  看了题后没看答案直接开始动工,本来就是一个比较简单的全排列问题,算法自己也立即想了出来,就是不断在排列好的序列中插入新的元素。可貌似自己很久没写过这些算法题了,具体实现起来竟然花了好长时间,中间几次明明知道思路可就是不知道怎么转化为代码 。不过还好最后终于搞定,有了如下代码:
 
package com.tc.test;

import java.util.Arrays;

public class MTest {
	private char list[] = new char[]{'1', '2', '2', '3', '4', '5'};
	private int total = list.length;
	
	
	public static void main(String[] args) {
		long l1 = System.currentTimeMillis();
		new MTest().test();
		long l2 = System.currentTimeMillis();
		System.out.println("time:" + (l2 - l1) + "ms");
	}


	
	private void test() {
		printInOrder(new char[list.length], 0);
	}
	
	private void printInOrder(char[] current,  int fill) {
		if (fill == total) {
			print(current);
			return;
		}
		char a = list[fill];
		for (int i = 0; i < total; i++) {
			if (current[i] == 0) {
				char[] tmp = Arrays.copyOf(current, total);
				tmp[i] = a;
				printInOrder(tmp, fill + 1);
			}
		}
	}
	
	private void print(char[] array) {
		String line = new String(array);

		if (line.charAt(2) == '4' || line.indexOf("35") != -1 || 
				line.indexOf("53") != -1) {
			return;
		}
		System.out.println(line);
	}
}



弄完自以为大功告成,和原文里的算法做了一下对比,结果发现上面算法的结果比原文中的结果数量多了一倍,仔细一想,原来忽略了两个2造成的影响,可是木已成舟,想不出方法从根源解决,只能在最后过滤一下了,于是乎,最终的成品变成了下面这个样子:
package com.tc.test;

import java.util.Arrays;
import java.util.BitSet;

public class MTest {
	private char list[] = new char[]{'1', '2', '2', '3', '4', '5'};
	private int total = list.length;
	private BitSet state = new BitSet(543222);
	
	public static void main(String[] args) {
		long l1 = System.currentTimeMillis();
		new MTest().test();
		long l2 = System.currentTimeMillis();
		System.out.println("time:" + (l2 - l1) + "ms");
	}


	
	private void test() {
		printInOrder(new char[list.length], 0);
	}
	
	private void printInOrder(char[] current,  int fill) {
		if (fill == total) {
			print(current);
			return;
		}
		char a = list[fill];
		for (int i = 0; i < total; i++) {
			if (current[i] == 0) {
				char[] tmp = Arrays.copyOf(current, total);
				tmp[i] = a;
				printInOrder(tmp, fill + 1);
			}
		}
	}
	
	private void print(char[] array) {
		String line = new String(array);
		int n = Integer.parseInt(line);
		if (state.get(n)) {
			return;
		}
		state.set(n);
		if (line.charAt(2) == '4' || line.indexOf("35") != -1 
				|| line.indexOf("53") != -1) {
			return;
		}
		System.out.println(line);
	}
}


和原文中的算法重新对比,完全一致,而且性能上还有20%左右的提升,不过缺点是要开一个近100K的BitSet。
分享到:
评论

相关推荐

    全排列算法实现(java\c#\c++,各种主流语言版本)

    这些实现遵循了基本的全排列算法思路,即通过递归和回溯来生成所有可能的排列。对于大型数据集,递归可能会导致栈溢出问题,因此有时会考虑非递归的迭代方法,如回溯搜索或者使用堆栈来存储中间状态,以提高效率。在...

    全排列算法部分算法需要自己优化修改

    全排列算法是计算机科学中一个基础且重要的问题,它涉及到数组或序列的所有可能的线性排列方式。在处理这个问题时,我们通常会采用递归或迭代的方式来实现。下面将详细介绍全排列算法及其优化方法。 全排列算法的...

    JAVA递归实现全排列

    JAVA递归实现全排列算法,含实现源代码,如a、b、c、d的全排列为: abcd abdc acbd acdb adcb adbc bacd badc bcad bcda bdca bdac cbad cbda cabd cadb cdab cdba dbca dbac dcba dcab dacb dabc

    彻底理解全排列算法

    全排列算法: 比如字符串abc,全排列结果为abc,acb,bac,bca,cba,cab。

    利用中介数实现全排列算法

    利用中介数实现全排列算法,采用java实现。

    组合数学全排列算法(转)

    全排列算法是组合数学中的一个重要概念,在计算机科学中有广泛的应用,例如在密码学、生物信息学以及各种算法设计中都有涉及。 #### 排列算法分类 在组合数学中,常见的全排列算法有以下几种: 1. **递归算法** -...

    Java实现字符数组全排列的方法

    在Java编程中,全排列是一个常见的问题,它涉及到算法和数据结构的知识。全排列是指从给定的字符数组中,按照一定的顺序生成所有可能的排列组合。这个问题通常使用回溯法来解决,因为它能够有效地避免重复的排列。...

    java递归实现N个数全排列输出

    现在,我们来看如何用Java编写一个递归函数来实现全排列。首先定义一个方法,接受一个整型数组和一个整数N作为参数,表示当前处理到数组的第几个元素。初始调用时,数组中的所有元素都未被处理,因此N等于数组长度。...

    java 递归,全排列

    java 递归,abcd全排列,非常简单的。

    计算机数据结构-全排列回溯算法-java

    在Java中实现回溯算法进行全排列通常分为以下步骤: 1. 定义一个递归函数,该函数接收当前排列和剩余未使用的元素作为参数。 2. 在递归函数的基线条件中,当所有元素都被使用时,输出当前排列,表示找到一个全排列...

    全排列-非递归算法

    全排列是一种经典的算法问题,它涉及在给定的有限序列中找出所有可能的元素排列方式。...代码可能涉及到循环、条件判断、数组操作等基本编程概念,通过学习和实践,可以提升对全排列算法的理解和应用能力。

    JAVA用递归实现全排列算法的示例代码

    "JAVA用递归实现全排列算法的示例代码" JAVA用递归实现全排列算法的示例代码主要介绍了JAVA用递归实现全排列算法的相关资料。全排列算法是一种经典的算法,在数学和计算机科学领域中有着广泛的应用。该算法的主要...

    Java 全排列

    Java 全排列算法实现,网上搜的,然后整理了一下。呵呵`````

    Java全排列算法字典序下的下一个排列讲解

    今天,我们将讨论如何使用Java实现全排列算法,并且讨论字典序下的下一个排列。 在讨论前,我们需要了解什么是全排列算法。全排列算法是一种算法,它可以将一个数组或集合中的所有元素排列成不同的顺序。例如,我们...

    字典排序求全排列的算法

    本例中,"DictionarySort.java"是一个Java程序,用于实现字典排序求全排列的算法。Java是一种广泛使用的面向对象的编程语言,具有丰富的库和强大的性能,非常适合处理这类算法问题。 下面,我们将详细讨论如何使用...

    java算法分析与设计之全排列问题源代码

    java算法分析与设计之全排列问题源代码 算法作为计算机专业学生的必修课,同时也是软件开发过程中必备的编程思想,对学习研究计算机专业意义重大;正因为这门课程难,所以除了相关方面的书籍,网络资源少的可怜,尤其...

    蓝桥杯java历年真题

    Java 实现全排列算法可以使用递归方法,通过将原数组分解为两个部分,一个是已经排列好的部分,另一个是还没有排列的部分。然后,对还没有排列的部分继续递归调用全排列算法,直到所有元素都被排列好为止。 2. 串的...

    java算法题(30个)

    - 辗转相除法通过连续相除直到余数为0,最后一个非零余数的除数就是最大公约数。 7. **数字串相加**: - 知识点:字符串处理,动态计算。 - 通过计算每一位的数值并累加,注意处理进位问题。 8. **完数**: - ...

    用java语言实现数字全排列

    题目描述:给定一个数列a1,a2,a3…an,输出他所有的全排列。 算法设计描述: 1、获取当前的一种排列,用start,end分别表示该排列的列头,列尾; 2、判断start是否和end相等,若相等,执行3,否则执行4; 3、将当前...

    全排列ⅱ(java代码).docx

    每次递归结束后,如果当前路径构成一个有效的全排列,就将其复制一份并添加到 `result` 中。 #### 递归与回溯操作 回溯函数 `backtrack` 是实现全排列的关键部分。它的主要逻辑如下: - **递归终止条件**:如果...

Global site tag (gtag.js) - Google Analytics