Erlang Thursday – digraph:in_neighbors/2

今天的Erlang Thursday讲的是 digraph:in_neighbors/2.

digraph:in_neighbors/2 第一个入参是一个有向图G,第二个入参是一个节点V,函数将返回一个由若干节点组成的列表,而且有从这些节点发出并进入节点V的边。

我们继续用上个星期的文章 digraph:get_path/3 里的例子基础上进行讲解。

有向图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Graph = digraph:new().
% {digraph,20498,24595,28692,true}
V1 = digraph:add_vertex(Graph).
% ['$v'|0]
V2 = digraph:add_vertex(Graph).
% ['$v'|1]
V3 = digraph:add_vertex(Graph).
% ['$v'|2]
V4 = digraph:add_vertex(Graph).
% ['$v'|3]
E1 = digraph:add_edge(Graph, V1, V2).
% ['$e'|0]
E2 = digraph:add_edge(Graph, V2, V3).
% ['$e'|1]
E3 = digraph:add_edge(Graph, V3, V4).
% ['$e'|2]
E4 = digraph:add_edge(Graph, V2, V4).
% ['$e'|3]
E5 = digraph:add_edge(Graph, V4, V1).
% ['$e'|4]

图和相关元素都设置好后,我们可以开始在我们的图里找不同节点的入站邻居节点 。

1
2
3
4
5
6
digraph:in_neighbours(Graph, V4).
% [['$v'|1],['$v'|2]]
digraph:in_neighbours(Graph, V1).
% [['$v'|3]]
digraph:in_neighbours(Graph, V2).
% [['$v'|0]]

上述输出我们可以看到对于节点4函数返回值是[[‘$v’ | 1],[[‘$v’ | 2]]],也就是节点2和节点3。对于节点1,我们得到一个 inbound 邻居节点4,而对于节点2,我们得到inbound邻居节点1。

digraph:out_neighbors/2

digraph模块也包含函数 digraph:out_neighbors/2 ,它的返回值是由从入参节点发出的边相应的所有节点组成的列表。

1
2
3
4
5
6
digraph:out_neighbours(Graph, V2).
% [['$v'|3],['$v'|2]]
digraph:out_neighbours(Graph, V4).
% [['$v'|0]]
digraph:out_neighbours(Graph, V1).
% [['$v'|1]]

我们从上图看到节点2有“指向”节点3和节点4的边,而我们再看 digraph:out_neighbors/2 的输出,得到的结果就是节点3和节点4。

这个例子里我们得到的节点列表是节点4在节点3点前面,但是这个顺序是不确定的,正如官方文档所讲的,“边是没有特定的顺序的”,这个情况对于 digraph:in_neighbors/2 也一样。

原文链接: https://www.proctor-it.com/erlang-thursday-digraph-in_neighbors-2/