【问题标题】:How do I implement a undirected graph for PPI using adjacency list in Perl or Java?如何在 Perl 或 Java 中使用邻接表为 PPI 实现无向图?
【发布时间】:2011-12-24 02:56:19
【问题描述】:

我有一个文本文件中的蛋白质列表,格式如下:

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

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

【问题讨论】:

  • PPI = 蛋白质蛋白质相互作用?

标签: java algorithm perl graph-algorithm


【解决方案1】:

在 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'}};

【讨论】:

  • 哦,感谢 Holygeek,它会读取所有文件。但我仍然不知道如何计算最短路径、最大和最小边,以及计算节点和边的数量。你能帮帮我吗?
  • 那么你需要阅读一些基本的图论。谷歌搜索"shortest path" graph theory 等等会给你一些关于如何实现这些算法的好主意。
  • 谢谢大家。特别是holygeek,感谢您花时间阅读我的问题并找到解决方案。
  • 嘿Holygeek:请帮我完成我的项目,这是我为 Dijkstra 算法尝试过的,但仍然不起作用。
【解决方案2】:

看看Open source libraries to design directed graphs。他们的建议是使用JGraphT。 javadoc 表明他们已经实现了广泛的图形操作,包括shortest path。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多