我前面写过一种方法生成全排列,现在看用DP的方法解决。
参考
How to generate permutations 看前面的那种解法。
DP的思路就是生成N个数的全排列,先考虑生成前面N-1个数字的全排列,然后把最后一个数字插入上一步每个结果的每个缝隙中,形成最后的结果。用perl比较好操纵数组,写起来的程序比较简单。(可惜这个博客不支持perl语法高亮啊)
use strict;
use warnings;
sub permutation {
my (@array) = @_;
my $length = scalar @array;
if($length == 1){
#如果数组就一个元素,返回的结果集合里面只有一个单元素数组
return [\@array];
}else {
#取出最后一个元素
my $tail = pop(@array);
#求解N-1个数字的全排列
my $sub_results = permutation(@array);
my $new_results = [];
foreach my $sub_result (@$sub_results){
my $pos = 0;
#取出的最后的那个元素可以插在0,1..$length-1等处
while($pos < $length){
my @new_result = @$sub_result;
#插入尾元素,形成新的数组
splice(@new_result, $pos, 0, $tail);
$pos++;
#收集结果
push @$new_results, \@new_result;
}
}
return $new_results;
}
}
sub main {
my @a = (6,7,8,9);
my $results = permutation(@a);
foreach my $result (@$results){
print join(',', @$result) . "\n";
}
}
main;
输出如下:
9,8,7,6
8,9,7,6
8,7,9,6
8,7,6,9
9,7,8,6
7,9,8,6
7,8,9,6
7,8,6,9
9,7,6,8
7,9,6,8
7,6,9,8
7,6,8,9
9,8,6,7
8,9,6,7
8,6,9,7
8,6,7,9
9,6,8,7
6,9,8,7
6,8,9,7
6,8,7,9
9,6,7,8
6,9,7,8
6,7,9,8
6,7,8,9
相比之下,这种思路要简单多了. 性能就要在考虑了.
分享到:
相关推荐
用序数法生成全排列,java语言,希望有帮助
在MATLAB中,生成全排列矩阵的算法通常涉及递归或回溯方法。 MATLAB是一种强大的数值计算和符号计算软件,它的语法简洁且功能强大,特别适合处理这类问题。生成全排列矩阵的MATLAB程序通常会利用内置函数`perms`,...
C++学的递归的全排列 当n>10 效率会很低 这个请注意
5. Steinhaus-Johnson-Trotter算法:这是一种生成全排列的高效算法,通过改变相邻元素的相对顺序来生成下一个排列。 6. Fischer’s algorithm:Fischer’s算法利用中介数的概念,通过一系列的交换操作生成新的排列...
资源名:生成全排列矩阵_matlab 资源类型:matlab项目全套源码 源码说明: 全部项目源码都是经过测试校正后百分百成功运行的,如果您下载后不能运行可联系我进行指导或者更换。 适合人群:新手及有一定经验的开发...
在MATLAB编程环境中,生成全排列矩阵是一项常见的任务,尤其在处理组合数学、数据分析或算法设计时。全排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排列的所有可能的方式。当m=n时,即为全排列。本...
C语言的全排列 注意 当n>10 效率会非常低
否则,对于当前位置,遍历所有未使用的数字,将其放置在当前位置,并递归地对剩余位置生成全排列。 以下是一个简单的C++代码实现全排列的例子: ```cpp #include #include void permute(std::vector<int> &nums...
标题中的“可直接运行 MATLAB生成全排列矩阵算法 程序源代码.rar”指的是一个包含MATLAB编程语言实现的全排列矩阵算法的源代码压缩包。全排列矩阵算法是一种计算一组数字所有可能排列顺序的算法,它在组合数学、数据...
字典序法生成全排列,希望对学习组合数学的同学有帮助
全排列的生成算法 全排列的生成算法是指对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。任何 n 个字符集的排列都可以与 1~n 的 n 个数字的排列一一对应,因此在此就以 n 个数字的排列...
本实验主要提供了两种生成全排列的方法,并结合C语言编写了相应的代码。 **方法一**依赖于一个随机文件来生成全排列。首先,需要一个预先设定好的全排列P作为初始状态,如0到n的自然排列。然后,从随机文件中读取n+...
邻位对换是一种生成全排列的策略,它通过交换相邻的元素来改变当前排列。例如,如果当前排列是123,可以将第一个和第二个元素交换得到132,或者将第二个和第三个元素交换得到123。通过循环并结合递归,可以生成所有...
基于交换的算法如Knuth的“鱼”算法或Heap’s算法,可以有效地生成全排列。虽然MATLAB中没有内置这样的函数,但可以通过自定义函数实现。这类算法通常涉及较少的递归,但代码实现相对复杂。 5. **并行计算**: ...
全排列是组合数学中的一个重要概念,它涉及到计算机科学中算法设计和分析的范畴,尤其是在解决排列组合问题时。在C/C++编程语言中,实现全排列通常需要借助递归或回溯法。以下是对全排列及其C/C++实现的详细解释。 ...
字典序、邻位对换、递归递增进位制数法、递归的递减进位制数法生成全排列。除递归地增是O(n·n!)外,其余三个都是O(n!)。main函数是计算1——12生成全排列的运行时间。
全排列生成算法是一种在计算机科学中常见的问题,用于找出一个给定序列的所有可能排列方式。在本场景中,我们关注的是字典序排列,这是一种特定的全排列顺序,按照字典顺序排列所有可能的组合。VC++是Microsoft开发...
【问题描述】输入整数N( 1 ),生成从1~N所有整数的全排列。 【输入形式】输入整数N。 【输出形式】输出有N!行,每行都是从1~N所有整数的一个全排列,各整数之间以空格分隔。各行上的全排列不重复。输出各行遵循...