我正在尝试表示传递关系(在数据库中)并且很难设计出最佳的数据结构。
基本上,数据结构是一系列对A → B
,如果A → B
和B → C
,则隐式A → C
。能够识别哪些条目是原始输入以及哪些条目是隐式存在对我来说很重要。询问A → C
是否等同于我有一个有向图,并询问该有向图中是否存在从A
到C
的路径。
我可以只表示原始条目,但如果我这样做,则需要花费大量时间来确定两个项目是否相关,因为我需要搜索所有可能的路径,这很慢。
或者,我可以存储原始边缘以及所有路径的列表。这样可以轻松添加新边缘,因为当我添加A → B
时,我可以采用以A
结尾的路径的笛卡尔积和以B
结尾的路径并将它们放在一起。在最坏的情况下,这有一些显着的空间开销O( n 2 ),但是具有很好的属性,查找,到目前为止最常见的操作,将是恒定时间。问题是删除,除了重新计算可能会或可能不会删除边缘的所有路径之外,我无法想到任何其他内容,这可能真的很讨厌。
有没有人有更好的想法?
技术说明:有向图可能是循环的,但这种关系是反身的,所以我不需要代表反身性或存储任何关于它的内容。
答案 0 :(得分:1)
这称为Reachability问题。
看起来你想要一个高效的在线算法,这是一个开放的问题,也是一个研究领域。
在cs.SE上查看我的类似问题:An incrementally-condensed transitive-reduction of a DAG, with efficient reachability queries,其中我在stackexchange中引用了几个相关的查询:
相关:
- What is the fastest deterministic algorithm for dynamic digraph reachability with no edge deletion?
- What is the fastest deterministic algorithm for incremental DAG reachability?
- Does an algorithm exist to efficiently maintain connectedness information for a DAG in presence of inserts/deletes?
- Is there an online-algorithm to keep track of components in a changing undirected graph?
- Dynamic shortest path data structure for DAG
请注意,即使某些算法可能仅适用于DAG,但如果它支持condensation(即将强连接组件折叠到一个节点中,因为它们被认为是相等的,即它们来回相关) ,它是等价的;在缩合之后,您可以查询代表节点的图形来代替任何压缩节点(因为它们彼此都可以到达,因此以完全相同的方式与图形的其余部分相关)。
我的结论是,迄今为止似乎没有一种有效的方法(在动态图的O(log n)查询的顺序上,在压缩图上具有输出敏感的更新时间)。如果效率较低,请参阅上面的相关链接。
我发现的最接近的实用算法是here(source),这是一个有趣的读物。我不确定您在任何论文中找到的数据结构或任何数据结构是多么容易/实用,都可以使其适应数据库。
PS。考虑将来在cs.stackexchange.com上询问与CS相关的问题。