2012-06-12 83 views
2

我有一個大約有25000條記錄的文件,每個記錄有超過13個條目是藥物名稱。我想爲這些條目形成所有可能的配對組合。例如:如果一條線有三條記錄A,B,C,我應該組合成1)AB 2)AC 3)B C.下面是我從互聯網上得到的代碼,它只在一條線分配給數組:Perl形成字符串隨機字符串組合

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

能否請你建議我解決這個問題呢?

+1

你的代碼的標準是可怕的,我已經通過'perltidy'運行它,從而大大改善了它。對編程不熟悉並不適合馬虎和不一致的佈局。 – Borodin

回答

1

您正在將@n設置爲包含@Drugs數組的第二個值的數組,請嘗試在Math :: Combinatorics構造函數中使用data => \@Drugs

另外,使用嚴格;使用警告;等等等等等等。

+0

...並使用開放和詞法文件句柄的三個參數版本......正確的縮進......不必要的使用'$ _' ...只需添加幾個點。 – dgw

1

數組中的所有對都可以直接計算。根據您的問題使用藥物A,B和C,您可能會認爲它們形成方陣。

AA AB AC 
BA BB BC 
CA CB CC 

您可能不希望「對角線」對AA,BB和CC。請注意,其餘元素是對稱的。例如,元素(0,1)是AB,(1,0)是BA。再次,我認爲這些是相同的,你不想重複。

要從線性代數中借用一個術語,您需要upper triangle。這樣做可以消除施工中的重複,假定給定生產線上的每個藥物名稱都是唯一的。下面是一個算法。

  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 Scalaris 
Perlix Hashagra 
Perlix Nextium 
Scalaris Hashagra 
Scalaris Nextium 
Hashagra Nextium
0

我已經回答了這樣的事情之前,爲別人。對他們來說,他們對如何將一系列字母組合成所有可能的單詞存在疑問。

看看How Can I Generate a List of Words from a group of Letters Using Perl。其中,您會看到一個使用my answerMath::Combinatoricsikegami具有的correct answer的示例。 (他用正則表達式做了一件很有趣的事情)。

我確信其中的一個會引導您找到您需要的答案。也許當我有更多的時間時,我會專門爲你的問題提供一個答案。我希望這個鏈接有幫助。