排列组合-插入算法
1.问题描述
将字符'1','2','2','3','4'的所有的组合用一个算法排列出来。
2.问题分析
这是一个排列问题,排列个数与参与排列的元素个数有关。假设参与排列的元素个数
为n,那么排列数等于n的阶乘,即F(n)=n!。n! = 1 * 2 * 3 * ... * n.
本文问题描述中出现了重复元素,最后排列中有很多重复的排列需要去掉。本文介绍一种
插入算法来解决这个问题。
所有的插入算法的一个共同点:从最小问题单元开始递推。
结合下面的图示开始递推。
图2-1
(1)当只有一个元素时,排列数为1,即一种排列。排列:
[1]
(2)当有两个元素时,排列数为2。排列:
[2,1],[1,2]
(3)当有三个元素时,排列数为1 * 2 * 3 = 6。排列:
[3,2,1],[2,3,1],[2,1,3],[3,1,2],[1,3,2],[1,2,3]
......
以此类推。
3.算法实现
将一个字符查到一个排列字符数组中:
char [][] insert(char [] a,char b) {
int row = a.length+1;
int col = row ;
int insertPos = 0;//插入位置
char [][] r = new char[row][col];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if(j < insertPos) {
r[i][j] = a[j];
} else if(j > insertPos ){
r[i][j] = a[j-1];
} else {
r[i][j] = b;//插入新的字符
}
}
insertPos++;//插入位置向后移动
}
return r;
}
主算法:
char [][] composition(char [] c) {
//存储排列组合后的结果
char [][] r = {{c[0]}};
//存储每次插入一个字符以后的所有结果。
char [][][] d ;
int ii;
for (int i = 1; i < c.length; i++) {
d = new char[r.length][0][0];
//插入新的字符
for (int j = 0; j < r.length; j++) {
d[j]=insert(r[j],c[i]);
}
//将d中的结果存放到r
r = new char[d.length*d[0].length][0];
ii = 0;
for (int j = 0; j < d.length; j++) {
for (int j2 = 0; j2 < d[j].length; j2++) {
r[ii++] = d[j][j2];
}
}
}
return r;
}
过滤算法:
Set<String> removeRepeat(char [][]r) {
Set<String> set = new HashSet<String>();
for (int i = 0; i < r.length; i++) {
set.add(new String(r[i]));
}
return set;
}
4.扩展
当有重复元素时,最后排列数为多少?
在回答上面的问题之前我们先通过本文中的算法测试一下。
测试代码:
public static void main(String[] args) {
Composition com = new Composition();
// new char[]{'1','2','3','4','2','2'}
// new char[]{'1','2','3','4','2','2','2'}
char [][] r = com.composition(new char[]{'1','2','3','4','2'});
System.out.println(r.length);//过滤前
Set<String> set = com.removeRepeat(r);
System.out.println(set.size());//过滤后
// Iterator<String> it = set.iterator();
// while (it.hasNext()) {
// System.out.println(it.next());
// }
}
测试结果:
(1)重复一次时,(这里重复元素为2):
new char[]{'1','2','3','4','2'}
结果:120,60
(2)重复两次时:
new char[]{'1','2','3','4','2','2'}
结果:720,120
(3)重复三次时:
new char[]{'1','2','3','4','2','2','2'}
结果:5040,210
......
通过逐一排列的过程可知,在排列中所有对于一个元素的所有重复元素在排列中的任何位置的机会概率是均等的。假设只有一个元素重复,则一个元素重复m次(总共有m+1个元素)后最终的排列数为F(n)= n!/(m+1)!。
5.总结
通过本文的学习,大家至少知道了一种排列的算法【插入算法】。但这不是最重要的,重要的是学会如何去分析,分解问题。将复杂问题简单化,找到其最小问题单元。从最简单的入手。因为人本身的Memory,CUP和Hard与计算机相比极为有限,并且这种差距还在与日俱增。所以我们只能先处理好最简单的最基本的问题,在接触计算机帮助我们处理复杂问题。
- 大小: 4 KB
- 大小: 19.6 KB
分享到:
相关推荐
在编程领域,排列组合算法是解决许多问题的关键技术,尤其在数据处理、数据分析以及优化问题中扮演着重要角色。在C#编程环境下,利用这些算法可以有效地生成所有可能的序列或者选择,帮助开发者构建出高效的解决方案...
排列组合是组合数学中的基本概念,广泛应用于各种算法设计和数据分析中。 排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列的方法数,记为P(n,m)。组合则是指从n个不同元素中不考虑顺序取出m个...
在计算机科学中,生成字符串的所有排列组合是一项基础但重要的任务,通常用于密码学、组合优化问题以及各种搜索算法中。对于长度为n的字符串,其所有可能的排列组合数量是n!(n的阶乘),这是因为每个位置都可以独立...
本资源包聚焦于几种常见的算法策略,包括穷举法、高精度计算、动态规划、回溯、贪心算法、排列组合以及排序。下面将逐一详细阐述这些算法思想及其应用。 1. **穷举法**:穷举法,也称为全搜索法,是一种通过尝试...
- **分类**: 包括快速排序、归并排序、插入排序等多种排序算法。 - **效率分析**: 对每种排序算法的时间复杂度进行了分析,帮助读者理解其适用场景。 **第六章:排列和组合** - **定义**: 排列是指从n个不同元素中...
排列和组合是组合数学的基本概念,广泛应用于计算机科学,特别是在游戏开发中的...通过深入理解和应用这些策略,我们不仅能解决高考数学中的排列组合难题,也能在实际的编程问题中灵活运用,提高算法的效率和准确性。
本讲义重点介绍了排列与组合的基本概念,排列的计算方法,以及组合数的性质和计算。 首先,我们来看两个基本的计数原理。加法原理和乘法原理是组合数学中的两个基础概念,它们是解决计数问题的出发点。 加法原理也...
在Golang中实现全排列算法主要是为了解决排列组合问题,特别是在处理字符串或数组时,例如在上述例子中,需要对一组数字进行字典序排序并输出所有可能的排列。全排列算法是找出一个序列中所有可能的排列方式,且每个...
排列组合是高中数学中的核心知识点,它涉及到统计与概率的学习,同时也与算法初步和复数有一定关联。在高考数学的复习中,这部分内容是必不可少的。以下是对排列、组合与二项式定理的详细解释: 1. **排列**:排列...
该文档“VB源码字符排列组合.pdf”是一个关于使用Visual Basic (VB)编程语言实现字符排列组合算法的示例代码。下面将详细解释其中涉及的关键知识点: 1. **Option Explicit**:这是VB的一个声明,强制在编写代码时...
排序算法则是数据结构中的重要部分,它们用于对一组数据进行有序排列。在这个实验中,我们将关注六种不同的排序算法:选择排序、冒泡排序、插入排序、基数排序以及快速排序和归并排序。下面是对这些排序算法的详细...
排序算法:排序算法是将一组数据按照一定的顺序排列的算法。常见的排序算法包括冒泡排序、插入排序、选择排序、快速排序、归并排序等。 搜索算法:搜索算法用于在数据集中查找特定元素的算法。常见的搜索算法包括...
在编程领域,排列组合是解决问题时经常会遇到的一种数学概念,特别是在设计算法时。组合与排列分别代表了不同的选择方式,而它们在计算机科学中的应用广泛,例如在解决优化问题、图论、搜索策略等。 首先,我们要...
总之,EVEN法是一种生成全排列的有效算法,特别适合于理解和实现组合数学中的排列问题。通过深入理解这个方法,不仅可以提升在算法设计和问题解决上的能力,还能在实际项目中找到应用场景,如优化搜索、组合优化等...
在本项目中,"排序算法比较问题"可能是对几种不同的排序算法进行性能分析,比如冒泡排序、插入排序、选择排序、快速排序、归并排序等,对比它们的时间复杂度和空间复杂度。 排序算法是计算机科学中的核心概念,它们...
1. **排序与搜索算法**:排序是将一组数据按照特定顺序排列的过程,如冒泡排序、插入排序、快速排序和归并排序等。搜索算法则是寻找数据结构中的特定元素,例如二分查找和哈希表查找。 2. **图算法**:图是表示对象...
排列组合是离散数学中的重要概念,主要应用于统计和概率论等领域,对于软件开发来说,理解和应用排列组合有助于解决各种优化问题,如任务调度、资源分配等。以下是对排列组合的二十种解法的详细解释: 1. **分类...