`
standalone
  • 浏览: 613172 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

怎样生成全排列?

阅读更多
我前面写过一种方法生成全排列,现在看用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语言,希望有帮助

    生成全排列矩阵.zip

    在MATLAB中,生成全排列矩阵的算法通常涉及递归或回溯方法。 MATLAB是一种强大的数值计算和符号计算软件,它的语法简洁且功能强大,特别适合处理这类问题。生成全排列矩阵的MATLAB程序通常会利用内置函数`perms`,...

    生成全排列 C++ 的 递归

    C++学的递归的全排列 当n&gt;10 效率会很低 这个请注意

    组合数学中的全排列生成算法

    5. Steinhaus-Johnson-Trotter算法:这是一种生成全排列的高效算法,通过改变相邻元素的相对顺序来生成下一个排列。 6. Fischer’s algorithm:Fischer’s算法利用中介数的概念,通过一系列的交换操作生成新的排列...

    生成全排列矩阵_matlab

    资源名:生成全排列矩阵_matlab 资源类型:matlab项目全套源码 源码说明: 全部项目源码都是经过测试校正后百分百成功运行的,如果您下载后不能运行可联系我进行指导或者更换。 适合人群:新手及有一定经验的开发...

    matlab经典算法的程序-生成全排列矩阵.zip

    在MATLAB编程环境中,生成全排列矩阵是一项常见的任务,尤其在处理组合数学、数据分析或算法设计时。全排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排列的所有可能的方式。当m=n时,即为全排列。本...

    生成全排列 C语言 递归的

    C语言的全排列 注意 当n&gt;10 效率会非常低

    quanpailie.rar_C++生成全排列_c quanpailie_全排列+c++

    否则,对于当前位置,遍历所有未使用的数字,将其放置在当前位置,并递归地对剩余位置生成全排列。 以下是一个简单的C++代码实现全排列的例子: ```cpp #include #include void permute(std::vector&lt;int&gt; &nums...

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

    标题中的“可直接运行 MATLAB生成全排列矩阵算法 程序源代码.rar”指的是一个包含MATLAB编程语言实现的全排列矩阵算法的源代码压缩包。全排列矩阵算法是一种计算一组数字所有可能排列顺序的算法,它在组合数学、数据...

    字典序法生成全排列

    字典序法生成全排列,希望对学习组合数学的同学有帮助

    全排列的生成算法

    全排列的生成算法 全排列的生成算法是指对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。任何 n 个字符集的排列都可以与 1~n 的 n 个数字的排列一一对应,因此在此就以 n 个数字的排列...

    随机全排列生成程序及其应用开发(有程序代码)

    本实验主要提供了两种生成全排列的方法,并结合C语言编写了相应的代码。 **方法一**依赖于一个随机文件来生成全排列。首先,需要一个预先设定好的全排列P作为初始状态,如0到n的自然排列。然后,从随机文件中读取n+...

    全排列生成算法(字典序、邻位对换、递增进位制数,递减进位制数)

    邻位对换是一种生成全排列的策略,它通过交换相邻的元素来改变当前排列。例如,如果当前排列是123,可以将第一个和第二个元素交换得到132,或者将第二个和第三个元素交换得到123。通过循环并结合递归,可以生成所有...

    MATLAB实现生成全排列矩阵【数学建模、科学计算算法】.zip

    基于交换的算法如Knuth的“鱼”算法或Heap’s算法,可以有效地生成全排列。虽然MATLAB中没有内置这样的函数,但可以通过自定义函数实现。这类算法通常涉及较少的递归,但代码实现相对复杂。 5. **并行计算**: ...

    C/C++全排列

    全排列是组合数学中的一个重要概念,它涉及到计算机科学中算法设计和分析的范畴,尤其是在解决排列组合问题时。在C/C++编程语言中,实现全排列通常需要借助递归或回溯法。以下是对全排列及其C/C++实现的详细解释。 ...

    字典序、邻位对换、递归递增进位制数法、递归的递减进位制数法生成全排列

    字典序、邻位对换、递归递增进位制数法、递归的递减进位制数法生成全排列。除递归地增是O(n·n!)外,其余三个都是O(n!)。main函数是计算1——12生成全排列的运行时间。

    全排列生成算法字典序vc++源码

    全排列生成算法是一种在计算机科学中常见的问题,用于找出一个给定序列的所有可能排列方式。在本场景中,我们关注的是字典序排列,这是一种特定的全排列顺序,按照字典顺序排列所有可能的组合。VC++是Microsoft开发...

    全排列数生成

    【问题描述】输入整数N( 1 ),生成从1~N所有整数的全排列。 【输入形式】输入整数N。 【输出形式】输出有N!行,每行都是从1~N所有整数的一个全排列,各整数之间以空格分隔。各行上的全排列不重复。输出各行遵循...

Global site tag (gtag.js) - Google Analytics