利用递归实现的全排列算法,需要的朋友拿去用了,不理解的留言给我...
废话不说了,接招:
package com.daily.d0915;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @description: 全排列工具类
* @author: luomeng
* @createDate: 2009-12-4 上午10:21:37
*/
public class QuanPaiLieUtils {
private static List<String> resultList = new ArrayList<String> ();
/**
* List中的字符进行全排列,排列结果放入resultList
* @param dataList 数据List
* @param removedList 临时数据List
*/
private static void paiLie(List<String> dataList,List<String> removedList){
int length = dataList.size();
if(length == 1){
StringBuffer str = new StringBuffer();
for(String obj : removedList){
str.append(obj);
}
str.append(dataList.get(0));
resultList.add(str.toString());
str = null;
}else{
for(int i=0;i<length;i++){
List<String> tempDataList = new ArrayList<String>();
List<String> tempRemovedList = new ArrayList<String>();
tempDataList.addAll(dataList);
tempRemovedList.addAll(removedList);
tempDataList.remove(i);
tempRemovedList.add(dataList.get(i));
paiLie(tempDataList,tempRemovedList);
}
}
}
/**
* 得到全排列后的所有数据,可能会有重复数据
* @param dataList
* @return
*/
public static List<String> getAllData(List<String> dataList){
paiLie(dataList, new ArrayList<String>());
return resultList;
}
/**
* 得到全排列后的不重复数据
* @param dataList
* @return
*/
public static List<String> getUnRepeatData(List<String> dataList){
paiLie(dataList, new ArrayList<String>());
Map<String,String> resultMap = new HashMap<String,String>();
for(String tempStr : resultList){
if(resultMap.get(tempStr)==null){
resultMap.put(tempStr, tempStr);
}
}
return new ArrayList<String>(resultMap.values());
}
/**
* 测试函数
* @param args
*/
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
List<String> resultList = QuanPaiLieUtils.getNoRepeatData(list);
if(null != resultList && resultList.size()>0 ){
String[] strArray = resultList.toArray(new String[0]);
for(String str:strArray){
System.out.println(str);
}
}
}
}
分享到:
相关推荐
用C语言写的一个递归全排列算法,附有较为详细的注释。
自己写的基于字符的全排列算法,代码简洁,高效,7位数的全排列都是秒排!用到了广度优先排列,深度优先搜索和几个递归,唯一没完成的是退出时释放内存,呵呵,破解密码时超有用的哟,,
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
总结,全排列算法主要通过递归或迭代实现,利用深度优先搜索或回溯策略。优化方法包括剪枝和记忆化,以减少重复计算和提高效率。对于具体的问题,需要根据实际需求和数据规模选择合适的实现方式。在编程实践中,理解...
以上内容涵盖了全排列算法的多个重要方面,包括基本定义、时间复杂度分析、算法设计、递归方法、字典序排列、STL函数使用、中介数概念、进位制方法、邻位对换法以及组合数生成等。这些知识点对于理解全排列算法的...
全排列算法的核心思想是通过递归地交换元素来生成所有可能的序列。假设我们有一个包含n个不同元素的数组,全排列的数量是n的阶乘(n!)。算法的基本步骤如下: 1. **选择基准点**:从数组的第一个元素开始作为基准...
全排列算法的基本思想是回溯法,通过递归或迭代的方式,将序列中的每个元素放在序列的第一个位置,然后对剩下的元素进行递归操作,直到所有元素都被尝试过并放置在首位。这种算法通常使用栈或递归来实现,递归版本...
### 全排列算法解析 #### 1. 全排列的定义和公式 全排列是指从一个包含`n`个不同元素的集合中选取全部`n`个元素,并按一定顺序排列形成的不同序列总数。数学上,`n`个不同元素的全排列数记为`n!`(`n`的阶乘),即...
全排列算法是计算机科学中一个基础且重要的概念,主要用于生成一组数据的所有可能的排列组合。在实际应用中,它常用于解决各种优化问题、搜索问题和组合数学问题。本实例将详细阐述一种实现n个数全排列的算法。 ...
根据提供的信息来看,实际文章内容并未直接包含关于组合数学中的全排列算法的详细解析,而是主要介绍了清华大学计算机科学与技术系的一些活动与新生入学情况。不过,既然题目要求围绕组合数学中的全排列算法进行展开...
### 非递归全排列算法 非递归实现的核心思想是通过不断调整已排序的序列,找到下一个更大的排列。算法主要分为以下几步: 1. 找到当前排列中的最小排列Pmin,即序列中每个元素都大于其前一个元素。 2. 从后向前...
因此,掌握非递归的全排列算法对于提升程序的性能至关重要。本文将详细介绍一种基于Python语言的非递归全排列实现方法,并通过具体的代码示例进行说明。 #### 二、知识点分析 ##### 2.1 插入法原理 非递归全排列...
例如,在计算彩票中奖概率、解决NP难问题(如电路板排列)等方面,全排列算法扮演着关键角色。递归算法因其清晰的结构和较强的可读性成为解决全排列问题的常见方法,但其效率相对较低,特别是在处理大规模问题时,...
在本例中,我们讨论的是使用C语言实现的全排列算法,主要关注递归方法。 在C语言中,全排列的实现通常基于回溯法。回溯法是一种试探性的解决问题的方法,它尝试分步地构造解决方案,并在每一步选择时,如果发现当前...
全排列递归算法,在VC下调试OK,递归算法简单快捷,大家理解理解
Objective-C实现全排列算法通常基于递归或回溯法。下面,我们将详细探讨如何使用Objective-C实现全排列算法,并通过数组保存结果。 首先,我们需要定义一个数组来存储原始数据,然后创建一个方法来处理全排列。这个...
"JAVA用递归实现全排列算法的示例代码" JAVA用递归实现全排列算法的示例代码主要介绍了JAVA用递归实现全排列算法的相关资料。全排列算法是一种经典的算法,在数学和计算机科学领域中有着广泛的应用。该算法的主要...
全排列是一种经典的算法问题,它涉及在给定的有限序列中找出所有可能的元素排列方式。...代码可能涉及到循环、条件判断、数组操作等基本编程概念,通过学习和实践,可以提升对全排列算法的理解和应用能力。