我有以下条目的文件:
1,2
2,3
4,5
1,3
1,4
5,6
...
这告诉 ids:第一列与第二列匹配。现在我想找到所有只有所有组合的 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)。
最后,我想在给定的一组坐标中找到所有组。