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中的数组哈希做同样的事情.
您可以使用该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)