Julia 朱莉娅:图形遍历的正确数据结构是什么?

Julia 朱莉娅:图形遍历的正确数据结构是什么?,julia,directed-acyclic-graphs,graph-traversal,Julia,Directed Acyclic Graphs,Graph Traversal,我正在编写一系列递归图算法,其中图节点具有父节点、子节点和许多其他属性。这些算法还可以动态创建节点,并使用递归函数 在这种情况下,正确的数据结构是什么?在C++中,我会通过指针实现这个(即每个节点都有一个向量父/代码>,向量子< /COD>),但是我不确定朱丽亚指针是否是正确的工具,或者如果还有其他的工具……?p> 在这方面,最先进的是LightGraphs.jl库。 它使用邻接列表表示图形,并假设节点的数据保存在图形外部(例如,在由节点标识符索引的向量中),而不是在图形内部。 这种方法通常是最

我正在编写一系列递归图算法,其中图节点具有父节点、子节点和许多其他属性。这些算法还可以动态创建节点,并使用递归函数


在这种情况下,正确的数据结构是什么?在C++中,我会通过指针实现这个(即每个节点都有一个<代码>向量父/代码>,<代码>向量子< /COD>),但是我不确定朱丽亚指针是否是正确的工具,或者如果还有其他的工具……?p> 在这方面,最先进的是LightGraphs.jl库。 它使用邻接列表表示图形,并假设节点的数据保存在图形外部(例如,在由节点标识符索引的
向量中),而不是在图形内部。
这种方法通常是最有效和最方便的(操作
数组
索引而不是引用)

jl为几种典型的图形算法提供了实现,并且通常是在图形上进行计算的方式

然而,LightGraphs.jl的方法在您连续同时在图中添加和销毁多个节点的情况下可能不太方便

现在,对于你提出的C++方法,它可以作为

完成。
struct MyNode{T}
       data::T
       children::Vector{MyNode}
       parents::Vector{MyNode}
       MyNode(data::T,children=MyNode[],parents=MyNode[]) where T= new{T}(data,children,parents)
end
该API可用于:

node1 = MyNode(nothing)

push!(node1.parents, MyNode("hello2"))
最后,由于LightGraphs.jl是Julia标准,因此通常值得提供一些桥接实现,以便您的API能够使用LightGraphs.jl函数。 为举例说明如何实现,请查看库

编辑:

通常,出于效率原因,您希望
数据
字段在整个图形中是同质的,在这种情况下,最好是:

struct MyNode{T}
       data::T
       children::Vector{MyNode{T}}
       parents::Vector{MyNode{T}}
       MyNode(data::T,children=MyNode{T}[],parents=MyNode{T}[]) where T= new{T}(data,children,parents)
end

标准的Julia graphs软件包可能满足您的要求。