20

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";
}
4

7 に答える 7

22

List::Permutorを使用することをお勧めします:

use List::Permutor;

my $permutor = List::Permutor->new( 0, 1, 2);
while ( my @permutation = $permutor->next() ) {
    print "@permutation\n";
}
于 2009-03-11T18:56:52.647 に答える
14

Algorithm::Permuteを使用することもできますし、Iterating Over Permutations (The Perl Journal、1998 年秋) は興味深い読み物になるかもしれません。

于 2009-03-11T18:34:00.687 に答える
4

これを試して、

use strict;
use warnings;

print "Enter the length of the string - ";
my $n = <> + 0;

my %hash = map { $_ => 1 } glob "{0,1,2}" x $n;

foreach my $key ( keys %hash ) {
    print "$key\n";
}

出力: これにより、可能なすべての数字の組み合わせが得られます。不要な組み合わせを除外するロジックを追加できます。

$ perl permute_perl.pl 
Enter the length of the string - 3
101
221
211
100
001
202
022
021
122
201
002
212
011
121
010
102
210
012
020
111
120
222
112
220
000
200
110
于 2015-09-22T03:38:02.860 に答える
2

辞書式順序で順列を生成するためのアルゴリズムを検討することをお勧めします。これが、最近問題24を解決した方法です。配列内のアイテムの数が増えると、後で順列を格納およびソートするのにコストがかかります。

List::PermutorManniによって提案された、は数値的にソートされた順列を生成するように見えます。それが私がPerlを使って行くことです。どうなるか教えてください。

于 2009-03-11T21:34:44.247 に答える