用什么数据结构来处理有向图路径?

3
我正在尝试表示一个可传递关系(在数据库中),但很难确定最佳数据结构。
基本上,数据结构是一系列对,如果和,那么隐含地。对我来说,能够确定哪些条目是原始输入,哪些条目是隐含的是很重要的。询问是否相当于在有向图中查询是否存在从到的路径。
我可以只表示原始条目,但如果这样做,确定两个项是否相关需要很长时间,因为我需要搜索所有可能的路径,这会非常慢。
或者,我可以存储原始边缘以及所有路径的列表。这使添加新边缘变得容易,因为当我添加时,我可以只需取以
结尾的路径和以结尾的路径的笛卡尔积并将它们放在一起。这在最坏情况下具有O(n²)的显着空间开销,但具有常数时间的查找操作是最常见的操作。问题在于删除,除了重新计算可能经过被删除边缘的所有路径,我想不出其他方法,而这可能非常棘手。
有更好的想法吗?
技术注释:有向图可能是循环的,但关系是自反的,因此我不需要表示自反性或存储任何有关它的信息。

@rici,coppro说这个关系是自反关系,而不是你在评论中提到的对称关系。这意味着每个节点与自身有关联。就图形而言,这意味着对于每个顶点_v_,都有一条边 _v → v_。 - Joshua Taylor
我不确定你应该使用什么数据结构,但以下观察结果可能有助于搜索。你的输入(一组对)是一个关系_R_。你正在寻找_R_的自反传递闭包。如果你将等式或对角线关系=调用,则正在寻找=∪_R_的传递闭包。现在,你可以搜索支持有效边缘删除的传递闭包数据结构。 - Joshua Taylor
这可能不是一个答案,而是一个建议。您介意使用图形数据库吗? - Tharindu Rusira
根据您需要做什么,@TharinduRusira的建议使用图形数据库可能有些过头了,但我同意您尝试使用RDF三元组存储和SPARQL 1.1将会非常容易。 - Joshua Taylor
1个回答

1

这被称为可达性问题。

看起来你想要一个高效的在线算法,这是一个开放问题,也是一个广泛研究的领域。

请参见我在cs.SE上的类似问题:具有高效可达性查询的逐步压缩传递闭包DAG,其中我引用了跨StackExchange的几个相关问题:

相关:

请注意,即使某些算法可能仅适用于DAG,如果它支持压缩(也就是将强连通分量折叠成一个节点,因为它们被认为相等,即它们来回关联),那么这是等价的;在压缩后,您可以查询代表节点的图表,而不是任何压缩的节点(因为它们都可以从彼此到达,并且因此以完全相同的方式与图表中的其余部分相关联)。
我的结论是,到目前为止,似乎没有一种有效的方法来实现这一点(对于动态图形进行O(log n)查询,并具有压缩图形上的输出敏感更新时间)。有关不太有效的方法,请参见上面的相关链接。
我找到的最接近实际应用的算法是这里(来源),读起来很有意思。我不确定在任何论文中你会找到的这个数据结构或者任何数据结构适用于数据库的难易程度。请记得将与计算机科学相关的问题发表在cs.stackexchange.com上。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接