数组散列中的连接数

dci*_*llo 1 arrays tree perl hash network-analysis

我有一个如下所示的数组哈希:

my %HoA = (
    "M" => [ "L", "E" ],
    "L" => [ "I" ],
    "E" => [ "B", "C" ],
    "B" => [ "A" ],
    "C" => [ "A" ]
);
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式将其可视化:

    M
   / \
  L   E
 /   / \
I   B   C
     \ /
      A
Run Code Online (Sandbox Code Playgroud)

现在,我想知道每个节点的连接数:

M 6
E 3
L 1
B 1
C 1
I 0
A 0
Run Code Online (Sandbox Code Playgroud)

使用R中的igraph包这很简单,但我很难用Perl中的数组哈希做同样的事情.

Bor*_*din 8

您可以使用该Graph模块在Perl中构建图形

你需要一个Graph::Directed物体


这是一个例子

use strict;
use warnings 'all';

use Graph::Directed;

my %HoA = (
    "M" => [ "L", "E" ],
    "L" => [ "I" ],
    "E" => [ "B", "C" ],
    "B" => [ "A" ],
    "C" => [ "A" ]
);

# Build the graph
#
my $g = Graph::Directed->new;

while ( my ($from, $to) = each %HoA ) {
    $g->add_edge($from, $_) for @$to;
}

# Build a table of successors of each vertex
#
my %succ;

for my $v ( $g->vertices ) {
    my @succ = $g->all_successors($v);
    $succ{$v} = \@succ;
}

# Print the vertices in descending order of successors
#
for my $v ( sort { @{$succ{$b}} <=> @{$succ{$a}} } $g->vertices ) {
    printf "%s %d\n", $v, scalar @{$succ{$v}};
}
Run Code Online (Sandbox Code Playgroud)

产量

M 6
E 3
C 1
B 1
L 1
A 0
I 0
Run Code Online (Sandbox Code Playgroud)