Как я могу генерировать все перестановки массива в Perl?

На вашем другом компьютере должна быть установлена ​​соответствующая версия Office. 15.0.0.0 должен соответствовать Office 2013, который должен быть установлен на вашем целевом компьютере (другие версии Office могут не работать). Это почти наверняка означает, что вы используете библиотеки межсоединений MSOffice, которые работают только в том случае, если офис установлен и против одной и той же версии.

Кроме того, вы можете реорганизовать свой код, чтобы непосредственно читать XML-файл Excel.

19
задан brian d foy 12 March 2009 в 09:44
поделиться

5 ответов

См. perlfaq4: , "Как я переставляю элементы N списка?"

<час>

Использование Список:: модуль Permutor на CPAN. Если список является на самом деле массивом, попробуйте Алгоритм:: Переставьте модуль (также на 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;

Вот немного программы, которая генерирует все перестановки всех слов на каждой строке входа. Алгоритм воплотил в переставлении (), функция обсуждена в Объеме 4 (все еще неопубликованный) Knuth Искусство Программирования и будет работать над любым списком:

#!/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;

Алгоритм:: модуль Циклов также обеспечивает функции NextPermute и NextPermuteNum, которые эффективно находят все уникальные перестановки массива, даже если он содержит дублирующиеся значения, изменяя его оперативный: если его элементы находятся в отсортированном по реверсу порядке тогда, массив инвертируется, делание его отсортировало, и это возвращает false; иначе следующая перестановка возвращается.

NextPermute использует строковый порядок и NextPermuteNum числовой порядок, таким образом, можно перечислить все перестановки 0.. 9 как это:

use Algorithm::Loops qw(NextPermuteNum);

my @list= 0..9;
do { print "@list\n" } while NextPermuteNum @list;
18
ответ дан 30 November 2019 в 02:16
поделиться

Я предлагаю, чтобы Вы использовали Список:: Permutor:

use List::Permutor;

my $permutor = List::Permutor->new( 0, 1, 2);
while ( my @permutation = $permutor->next() ) {
    print "@permutation\n";
}
22
ответ дан 30 November 2019 в 02:16
поделиться

Вы могли использовать Алгоритм:: Переставьте и возможно , Итерация По Перестановкам (Журнал Perl, Осень 1998 года) является интересным чтением для Вас.

14
ответ дан 30 November 2019 в 02:16
поделиться

Я рекомендую смотреть алгоритм для генерации перестановок в лексикографическом порядке , который является, как я недавно решил проблема 24 . Когда количество объектов в массиве становится большим, становится дорого сохранить и отсортировать перестановки позже.

Это похоже List::Permutor, который был предложен Manni, генерирует численно отсортированные перестановки. Это - то, что я пошел бы с использованием Perl. Сообщите нам, как это складывается.

2
ответ дан 30 November 2019 в 02:16
поделиться
1
ответ дан 30 November 2019 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: