`
changqingonly
  • 浏览: 25620 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

学习全排列算法

阅读更多
问题描述:将8个"车"放在8*8的国际象棋盘上,如果他们两两均不能互吃,那么称8个"车"处于一个安全状态。问共有多少种不同的安全状态?

解题思路:8个车处于安全状态当且仅当它们处于不同的8行8列上。用一个排列A1,A2,A3,....A8,对应一个安全状态,使A1表示第i行的A1列上放置一个"车"。这种对应显然是一对一的。因此,安全状态的总数等于这个数的全排列总数8!=40320。

程序实现思路:设F(N) = N!,由于N!=N*(N-1)....2*1;那么有递归方程式: F(N) = N*F(N-1);

public static List<StringBuffer> Pmin(char[] source, int len) {
		
		// 当前全排列的结果集合
		List<StringBuffer> currSet = new ArrayList<StringBuffer>();
		
		// 递归出口
		if(len == 1){
			currSet.add(new StringBuffer(String.valueOf(source[0])));
		    return currSet;	
		}
		
		List<StringBuffer> lstSet = null;
		// 取得(N-1)!=N-1的全排列 
		lstSet = Pmin(source, len - 1);
		
		//-----------------------------------------------------------------
		// 对(N-1)!得到的排列字符集合进行字符插入操作,得到N!
		//-----------------------------------------------------------------
		// 插入字符
		String currChar = String.valueOf(source[len - 1]); 
		
		for(int index = 0; index < lstSet.size(); index++){
			StringBuffer currSb = lstSet.get(index);
			for(int i = 0; i < currSb.length() + 1; i++){
				StringBuffer nxtSb = new StringBuffer(currSb);
				nxtSb.insert(i, currChar);
				currSet.add(nxtSb);
			}
		}
		
		return currSet;
	}


只可惜不能递归多层,10个字符的全排列就然JDK受不了。那位牛人知道这个实现的优化,请不吝指导。
分享到:
评论

相关推荐

    全排列算法实现(C)

    实现全排列组合的算法,供大家学习与参考。在需要对排列组合做差异分析的时候可以直接使用。例如:几个正则式的不同排列组合对匹配效果的影响

    c#全排列的算法

    C#全排列算法 在计算机科学中,全排列是指对一个集合中的所有元素进行排列的操作。全排列算法是一种常用的算法,用于生成所有可能的排列方式。在C#中,可以使用递归或迭代的方式来实现全排列算法。 在给定的代码中...

    Python字符串的全排列算法实例详解

    通过本篇文章的学习,我们了解了如何使用Python来实现字符串的全排列算法,并通过一个具体的例子详细地解释了其实现过程。递归是一种非常强大的工具,在解决此类问题时非常有效。此外,我们还学习了如何处理字符串中...

    一种计算全排列的简易算法

    在计算机科学中,全排列算法经常用于解决各种排列组合的问题,比如测试用例的生成、数据排序等。 在给定的标题“一种计算全排列的简易算法”中,我们可以推测这是一种简化版的全排列算法实现。全排列算法通常有多种...

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

    "JAVA用递归实现全排列算法的示例代码" JAVA用递归实现全排列算法的示例代码主要介绍了JAVA用递归实现全排列算法的相关资料...JAVA用递归实现全排列算法的示例代码可以帮助我们更好地理解和学习全排列算法的实现细节。

    使用javascript写的全排列算法演示(分为回溯法演示和交换法演示)

    总之,通过学习和实践这两个JavaScript实现的全排列算法,你不仅可以提升JavaScript编程技巧,还能增强算法思维,对于计算机科学的学习和职业生涯都大有裨益。所以,如果你对这个主题感兴趣,不要犹豫,立即下载并...

    排列组合的全排列算法(交换算法)

    全排列算法是计算机科学中处理数组或集合的一种经典方法,主要应用于组合数学和算法设计领域。在本场景中,我们关注的是"交换算法",它用于生成一个给定数组的所有可能排列。全排列是指从n个不同元素中取出m个元素...

    qpl.rar_全排列

    在学习全排列算法时,还要注意以下几点: - 空间复杂度:全排列算法通常需要O(n)的空间,因为需要存储当前的排列状态。 - 时间复杂度:全排列的时间复杂度是O(n!),因为对于n个不同的元素,有n!种排列方式。 - 回溯...

    使用C++实现全排列算法的方法详解

    此外,可以使用STL中的`std::next_permutation`函数来简化全排列的实现,但理解递增进位制和递减进位制的原理对于深入学习和理解全排列算法仍然十分必要。 总的来说,使用C++实现全排列算法涉及对递增进位制和递减...

    C语言实现全排列算法模板的方法

    在实践中,全排列算法有着广泛的应用前景,如数据加密、机器学习、数据挖掘等领域。 在本文中,我们将通过示例代码介绍C语言实现全排列算法模板的方法,着重强调递归思路和 Swap 函数的实现细节。读者可以通过学习...

    可直接运行 MATLAB生成全排列矩阵算法 程序源代码.rar

    通过研究和理解这些源代码,开发者不仅可以掌握全排列算法的具体实现,还能进一步提升在MATLAB中的编程技巧,同时了解如何优化算法性能,降低时间复杂度。对于学习和教学算法、进行相关项目开发的人员来说,这是一个...

    全排列VC源代码,仅供参考

    全排列是一种经典的算法问题,广泛应用...通过阅读和理解源代码,你可以深入学习全排列算法,以及如何在VC环境下用C++编写这样的算法。记住,实践是检验理解和掌握知识的最好方式,所以尝试运行和调试代码以加深理解。

    全排列的算法 翻转法 换位法 字典序法

    翻转法是一种基于回溯思想的全排列算法。基本思路是从第一个元素开始,每次选择一个未使用的元素放置在当前排列的末尾,然后递归地对剩余元素进行全排列。当所有元素都被使用过且已形成一个合法排列时,返回结果。在...

    不得不说的全排列算法递归实现

    此外,还需要注意编程语言的特性,比如一些语言提供的库函数可以直接用于生成全排列,但理解和掌握递归实现全排列算法对学习算法思想具有重要意义。 递归算法虽然概念上简单易懂,但是在理解和使用上往往需要一定的...

    全排列-非递归算法

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

    组合数学全排列生成算法

    项目"组合数学project"中包含的代码可以作为学习和实践全排列生成算法的资源,通过阅读和理解这些代码,开发者可以深入理解这四种算法的工作原理,为实际编程提供参考。同时,也可以在此基础上进行扩展和优化,比如...

    几种全排列的算法(C语言实现)

    全排列算法的选择应根据实际问题的需求和性能要求来确定。回溯法易于理解,但效率较低;堆栈法和位运算法效率较高,但实现相对复杂;动态规划则适合于需要优化性能且对算法理解深入的情况。 通过阅读“排列组合ppt...

    js代码-sku全排列算法

    在JavaScript编程领域,"sku全排列算法"是一个常见的问题,主要涉及到数组的组合与排列,以及可能涉及到深度优先搜索(DFS)或回溯算法。在电商系统中,SKU(Stock Keeping Unit,库存量单位)通常用来唯一标识商品...

Global site tag (gtag.js) - Google Analytics