2

約 25000 レコードのファイルがあり、各レコードには 13 を超えるエントリがあり、薬物名です。これらのエントリのすべての可能なペアの組み合わせを形成したいと考えています。例: 行に 3 つのレコード A、B、C がある場合、1) AB 2) AC 3)B C のように組み合わせを形成する必要があります。以下はインターネットから取得したコードです。配列:

use Math::Combinatorics;

my @n = qw(a b c);
my $combinat = Math::Combinatorics->new(
  count => 2,
  data  => [@n],
);

while ( my @combo = $combinat->next_combination ) {
  print join( ' ', @combo ) . "\n";
}

私が使用しているコードは、出力を生成しません:

open IN, "drugs.txt" or die "Cannot open the drug file";
open OUT, ">Combination.txt";

use Math::Combinatorics;

while (<IN>) {
  chomp $_;
  @Drugs = split /\t/, $_;
  @n = $Drugs[1];

  my $combinat = Math::Combinatorics->new(
    count => 2,
    data  => [@n],
  );

  while ( my @combo = $combinat->next_combination ) {

    print join( ' ', @combo ) . "\n";
  }
  print "\n";
}

この問題の解決策を教えてください。

4

3 に答える 3

1

@n配列の2番目の値を含む配列に設定しているので、Math::Combinatoricsコンストラクターで@Drugs使用してみてください。data => \@Drugs

また、strictを使用します。警告を使用します。何とか何とか何とか。

于 2012-06-12T05:20:30.930 に答える
1

配列のすべてのペアは、簡単に計算できます。質問のように薬 A、B、C を使用すると、正方行列を形成していると考えることができます。

AA  AB  AC
BA  BB  BC
CA  CB  CC

おそらく、AA、BB、および CC の「対角線」のペアは必要ありません。残りの要素は対称であることに注意してください。たとえば、要素 (0,1) は AB であり、(1,0) は BA です。ここでも、これらは同じであり、重複したくないと思います。

線形代数から用語を借りるには、上三角形が必要です。このようにすることで、指定された行の各薬剤名が一意であると仮定して、構造によって重複が排除されます。このためのアルゴリズムを以下に示します。

  1. 行上の各薬物qを順番に選択します。これらのそれぞれについて、手順 2 と 3 を実行します。
  2. qの直後の薬物から始めて、リストの残りの各薬物rに対して、手順 3 を実行します。
  3. ペア ( q , r ) を記録します。
  4. 記録されたリストは、すべての一意のペアのリストです。

Perlでは、これは次のようになります

#! /usr/bin/env perl

use strict;
use warnings;

sub pairs {
  my @a = @_;

  my @pairs;
  foreach my $i (0 .. $#a) {
    foreach my $j ($i+1 .. $#a) {
      push @pairs, [ @a[$i,$j] ];
    }
  }

  wantarray ? @pairs : \@pairs;
}

my $line = "Perlix\tScalaris\tHashagra\tNextium";
for (pairs split /\t/, $line) {
  print "@$_\n";
}

出力:

Perlix スカラリス
パーリックス ハシャグラ
パーリックス ネクティウム
スカラリス・ハシャグラ
スカラリス・ネクティウム
ハシャグラ・ネクティウム
于 2012-06-12T13:33:15.670 に答える
0

私は以前に他の誰かのためにこのようなことを答えました。彼らには、文字のリストをすべての可能な単語に結合する方法についての質問がありました。

How Can I Generate a List of Words from a group of Letters Using Perl をご覧ください。その中で、私の答え池上が持っていた正解からMath ::Combinatoricsの使用例を見ることができます。(彼は正規表現でかなり興味深いことをしました)。

これらのいずれかが必要な答えにつながると確信しています。時間ができたら、あなたの質問に対する具体的な回答を具体化するつもりです。このリンクがお役に立てば幸いです。

于 2012-06-12T14:10:33.533 に答える