我试图表示一个传递关系(在数据库中)并且很难找出最好的数据结构。
基本上,数据结构是一系列对A → B
,例如 ifA → B
和B → C
, then 隐含A → C
。能够识别哪些条目是原始输入以及哪些条目是隐式存在的,这对我来说很重要。询问是否A → C
相当于我有一个有向图并询问该有向图中是否存在从A
到的路径C
。
我可以只表示原始条目,但如果我这样做,则需要花费大量时间来确定两个项目是否相关,因为我需要搜索所有可能的路径,这相当慢。
或者,我可以存储原始边缘以及所有路径的列表。这使得添加新边变得容易,因为当我添加时,A → B
我可以将路径结尾的笛卡尔积和路径结尾A
的路径B
放在一起。在最坏的情况下,这具有 O( n 2 ) 的一些显着空间开销,但具有很好的属性,即查找,迄今为止最常见的操作,将是恒定时间。问题是删除,除了重新计算所有可能穿过或不穿过边缘的路径之外,我真的想不出任何东西,这真的很讨厌。
有没有人有更好的想法?
技术说明:有向图可能是循环的,但关系是自反的,所以我不需要表示自反或存储任何关于它的东西。