次のエントリを含むファイルがあります。
1,2
2,3
4,5
1,3
1,4
5,6
...
これは ID を示します。最初の列は 2 番目の列と一致します。ここで、すべての組み合わせのみを持つすべての ID グループを見つけたいと考えています。つまり、以下を出力する必要があります。
1,2,3
4,5
1,4
5,6
ソリューション用の perl スクリプトを作成しようとしました。
while(<STDIN>) {
if(m/^(\d+),(\d+)/) {
$dub{$1}{$2} = 1;
$dub{$2}{$1} = 1;
$hs{$1} = 1;
$hs{$2} = 1;
}
}
$i=0;
foreach $a (keys %dub) {
$grp[$i]{$a} = 1;
foreach $b (keys %{$dub{$a}}) {
$grp[$i]{$b} = 1;
foreach $c (keys %hs) {
if($c == $a || $c == $b) { next; }
$flag = 1;
foreach $d (keys %{$grp[$i]}) {
if(!$dub{$d}{$c}) {
$flag = 0;
last;
}
}
$grp[$i]{$c} = 1 if($flag);
}
$i++;
}
}
for($i=0; $i<=$#grp; $i++) {
print join(",", (keys %{$grp[$i]}))."\n";
}
しかし、これは実行に非常に時間がかかります。上記のスクリプトのより良い解決策、アルゴリズム、またはパフォーマンス調整はありますか? LAMPでの解決策は大歓迎です。ありがとう
編集:
(1,2) は「1 と 2 は類似している」と定義され、(2,3) は「2 と 3 は類似している」と定義され、(1,4) は「1 と 4 は類似している」と定義されます。 (1,3) は「1 と 3 は類似している」と定義されます。
これらの類似性から、グループ (1,2,3) は互いに類似しているが、グループ (1,2,3,4) ではないと結論付けています。グループ (1,2,3,4) を形成するには、データに (2,4) および (3,4) などの他のエントリが必要です。
最後に、指定された座標セット内のすべてのグループを見つけたいと思いました。