В Джулии ультрасовременной в этом плане является библиотека LightGraphs.jl. Он использует списки смежности для представления графа и предполагает, что данные для узлов хранятся вне графа (например, в Vector
s, проиндексированных идентификаторами узлов), а не внутри графа. Этот подход, как правило, наиболее эффективен и наиболее удобен (работа с Array
индексами, а не со ссылками).
LightGraphs.jl обеспечивает реализацию нескольких типичных графовых алгоритмов и обычно используется при выполнении вычислений на графах.
Однако подход LightGraphs.jl может быть менее удобным в сценариях, когда вы постоянно одновременно добавляете и удаляете множество узлов в графе.
Теперь, что касается эквивалента предложенного вами подхода С++, его можно выполнить как
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. Для иллюстрации того, как это можно сделать, посмотрите библиотеку SimpleHypergraphs.jl.
ИЗМЕНИТЬ:
Обычно из соображений эффективности вы хотите, чтобы поле data
было однородным по всему графику, в этом случае лучше:
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
person
Przemyslaw Szufel
schedule
21.06.2019