如何使用Perl或Java中的邻接列表为PPI实现无向图?

时间:2011-12-24 02:56:19

标签: java algorithm perl graph-algorithm

我在文本文件中列出了一些蛋白质列表,如下所示:

ATF-1 MET4  
ATF-1 NFE2L1  
ATF-2 ATF-7  
ATF-2 B-ATF    
ARR1 ARR1  
ARR1 CHOP  

我想从文本文件中读取并使用Java或Perl中的邻接列表在无向图中实现它们。我想计算边的最小和最大数量,节点之间的最短和最长路径,以及其他类似的函数。

2 个答案:

答案 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。他们的建议是使用JGraphTjavadoc表明他们已经实施了各种图表操作,包括shortest path