如何在 Perl 中生成数组的所有排列?

2024-06-25

生成所有内容的最佳(优雅、简单、高效)方式是什么?n!perl 中数组的排列?

例如,如果我有一个数组@arr = (0, 1, 2),我想输出所有排列:

0 1 2
0 2 1
1 0 2
1 2 0
2 0 1
2 1 0

它可能应该是一个返回迭代器的函数(惰性/延迟评估,因为n!可以变得如此大),所以可以这样调用:

my @arr = (0, 1, 2);
my $iter = getPermIter(@arr);
while (my @perm = $iter->next() ){
    print "@perm\n";
}

From perlfaq4 http://faq.perl.org/perlfaq4.html: “如何排列列表中的 N 个元素?” http://learn.perl.org/faq/perlfaq4.html#How-do-I-permute-N-elements-of-a-list:


在 CPAN 上使用 List::Permutor 模块。如果列表实际上是一个数组,请尝试 Algorithm::Permute 模块(也在 CPAN 上)。它是用 XS 代码编写的,非常高效:

use Algorithm::Permute;

my @array = 'a'..'d';
my $p_iterator = Algorithm::Permute->new ( \@array );

while (my @perm = $p_iterator->next) {
   print "next permutation: (@perm)\n";
}

为了更快地执行,您可以这样做:

use Algorithm::Permute;

my @array = 'a'..'d';

Algorithm::Permute::permute {
    print "next permutation: (@array)\n";
} @array;

这是一个小程序,它生成每行输入上所有单词的所有排列。 Knuth 的《计算机编程艺术》第 4 卷(尚未出版)中讨论了 permute() 函数中体现的算法,并且适用于任何列表:

#!/usr/bin/perl -n
# Fischer-Krause ordered permutation generator

sub permute (&@) {
    my $code = shift;
    my @idx = 0..$#_;
    while ( $code->(@_[@idx]) ) {
        my $p = $#idx;
        --$p while $idx[$p-1] > $idx[$p];
        my $q = $p or return;
        push @idx, reverse splice @idx, $p;
        ++$q while $idx[$p-1] > $idx[$q];
        @idx[$p-1,$q]=@idx[$q,$p-1];
    }
}


permute { print "@_\n" } split;

Algorithm::Loops 模块还提供 NextPermute 和 NextPermuteNum 函数,它们可以有效地查找数组的所有唯一排列,即使它包含重复值,也可以就地修改它:如果其元素按反向排序,则数组将被反转,使其排序,并返回 false;否则返回下一个排列。

NextPermute 使用字符串顺序和 NextPermuteNum 数字顺序,因此您可以像这样枚举 0..9 的所有排列:

use Algorithm::Loops qw(NextPermuteNum);

my @list= 0..9;
do { print "@list\n" } while NextPermuteNum @list;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Perl 中生成数组的所有排列? 的相关文章

  • Perl 中令人困惑的文件句柄

    一直在使用以下脚本 但仍然无法理解两种不同 类型 的文件句柄形式背后的含义 任何见解将不胜感激 usr bin perl use warnings use strict open FH example txt or die while
  • php,in_array,0值

    我试图理解in array下一个场景的行为 arr array 2 gt Bye 52 77 3 gt Hey var dump in array 0 arr 返回值in array 是布尔值true 正如你所看到的no值等于0 所以有人可
  • Java 和 C# - 字节数组到长整型转换的区别

    这对我来说很奇怪 当我在Java中运行时 byte data new byte 50 106 40 22 94 119 52 8 ByteBuffer bb ByteBuffer wrap data System out println b
  • 从日期中添加或减去天数的算法?

    我正在尝试编写一个 Date 类以尝试学习 C 我正在尝试找到一种算法来添加或减去日期的天数 其中日从 1 开始 月从 1 开始 事实证明它非常复杂 谷歌也没有出现太多 有谁知道有一个算法可以做到这一点 最简单的方法是实际编写两个函数 一个
  • exsl:xsl:if 块中的文档

    这是我的用例的简化版本 1 我有一个转换xsl文件 如下
  • 在 Spark 中访问数组列

    Spark DataFrame 包含类型为 Array Double 的列 当我尝试将其返回到 map 函数时 它会抛出 ClassCastException 异常 以下 Scala 代码生成异常 case class Dummy x Ar
  • 尝试计算盒子的分数时小数精度损失

    我有一个场景 我有一个包含 3 个罐头的标准盒子 出于显示和查询的目的 我必须以其标准配置的十进制数量进行报告 不可能说1盒3罐 1盒2罐 等等 例如 最初我会有1盒3罐然后我移除 1 个罐子 结果是0 66 循环盒 3 罐然后我再移除 1
  • Rails - 查找多个数组之间的交集

    我正在尝试查找多个数组之间的交集值 例如 code1 1 2 3 code2 2 3 4 code3 0 2 6 所以结果是 2 我知道在 PHP 中你可以使用 array intersect 来做到这一点 我希望能够轻松添加额外的数组 所
  • 将字节数组写入txt文件并将其读回

    我有一个字节数组 我需要将其写入 txt 文件 之后我需要从那里读取该字节数组 这里出现了一个问题 我读了这个将Java字符串转换为字节数组 https stackoverflow com questions 5499924 convert
  • 迭代格雷码更改位置的有效方法

    有多种迭代方式n 位格雷码 https en wikipedia org wiki Gray code Constructing an n bit Gray code 有些比其他更有效率 但是 我实际上并不需要格雷码 而是想迭代格雷码列表中
  • 在 python numpy 中构建一个 nxn 矩阵,对于任何 n

    是否可以使用 python 的 numpy 版本 3 3 编写构建 nxn 矩阵的代码 而不指定 n 我需要将条目索引为 A i j 或类似的东西 但我什至不知道如何定义 A i j 以便它们实际上是对象 我认为这样的事情可能会起作用 n
  • JavaScript - 按键减少对象数组[重复]

    这个问题在这里已经有答案了 使用对象数组 例如 const arr name qewregf dqewafs value qewregf dqewafs answer count 2 name survey with select valu
  • 填充整型数组与填充浮点型数组相同吗?

    我刚刚接触 C 语言 并被指派编写一个程序来模拟杂货店的自助结账队伍 这涉及到我必须根据用户输入用杂货的价格填充一个数组 然后将它们相加并将它们复制到文件中 填充整数数组的最简单方法是使用 for 循环 但是对于 float 类型的数组来说
  • 简单的 DAWG 创建算法?

    我需要创建一个 DAWG http en wikipedia org wiki Directed acirclic word graph http en wikipedia org wiki Directed acyclic word gr
  • 如何获取字母数组的每种可能模式[重复]

    这个问题在这里已经有答案了 可能的重复 有没有更好的方法来进行字符串排列 https stackoverflow com questions 1995328 are there any better methods to do permut
  • 在 foreach 循环中使用 next

    我正在使用 foreach 循环数组 在特定情况下 我需要在迭代到达下一个元素 如预测 之前知道下一个元素的值 为此 我计划使用该功能next http www php net manual en function next php 在文档
  • 求 a 范围内的 pow(a^b)modN

    对于给定的b and N以及一系列a say 0 n 我需要找到ans 0 n 1 where ans i 没有a s为此pow a b modN i 我在这里搜索的是可能的重复pow a b modN对于一系列a 以减少计算时间 例子 i
  • 在 C/C++ 中绘制填充椭圆的简单算法

    在SO上 找到了以下绘制实心圆的简单算法 for int y radius y lt radius y for int x radius x lt radius x if x x y y lt radius radius setpixel
  • Javascript - 通过键获取特定 JSON 数组元素内的属性值

    我有一个像这样的 JSON 结构 map key1 valueA1 key2 valueA2 key3 valueA3 key1 valueB1 key2 valueB2 key3 valueB3 key1 valueC1 key2 val
  • 矩阵行列式算法 C++

    我是编程新手 我一直在寻找一种找到矩阵行列式的方法 我在网上找到了这段代码 但我很难理解这里的算法 我对递归的基础没有问题 但继续和主循环我很难理解 非常感谢任何可以向我解释该算法的人 int determ int a MAX MAX in

随机推荐