我在文本文件中列出了一些蛋白质列表,如下所示:
ATF-1 MET4
ATF-1 NFE2L1
ATF-2 ATF-7
ATF-2 B-ATF
ARR1 ARR1
ARR1 CHOP
我想从文本文件中读取并使用Java或Perl中的邻接列表在无向图中实现它们。我想计算边的最小和最大数量,节点之间的最短和最长路径,以及其他类似的函数。
答案 0 :(得分:3)
在perl中,您可以使用这样的哈希来表示图形:
use warnings;
use strict;
my %graph;
sub add_edge {
my ($n1, $n2) = @_;
$graph{$n1}{$n2} = 1;
$graph{$n2}{$n1} = 1;
}
sub show_edges {
foreach my $n1 (keys %graph) {
foreach my $n2 (keys %{$graph{$n1}}) {
print "$n1 <-> $n2\n";
}
}
}
while (<>) {
my ($n1, $n2) = split /\s+/;
add_edge($n1, $n2);
}
show_edges();
像这样运行:
perl script.pl input.txt
对于最短路径,您必须决定要搜索最短路径的起始节点和结束节点。
为此你可以使用Dijkstra的算法。简而言之,这就是算法的工作原理:
让我们调用起始节点A和结束节点B.
假设我们已经知道从A到B的最短路径。如果我们在B处,那么使用最便宜的路径回溯我们的步骤应该会让我们回到A点.Dijkstra的算法从A开始并记录成本转到所有A的相邻节点的路径,并为每个相邻节点重复该过程。完成后,我们可以通过从B回溯到A来打印从A到B的最短路径。
获取节点数:print keys %graph;
要获得边数,您必须(唯一地)计算每个哈希元素中的条目数,例如计算一个节点的边数:print keys %{$graph{'ATF-1'}};
答案 1 :(得分:0)
看看Open source libraries to design directed graphs。他们的建议是使用JGraphT。 javadoc表明他们已经实施了各种图表操作,包括shortest path。