我有一个完全符合我需求的DAG实现。我正在使用它作为我的一个项目的内部结构。最近,我遇到了一个用例,如果我修改了一个节点的属性,我需要将该属性传播到它的父节点,一直到根节点。我的DAG中的每个节点当前都有一个邻接列表,它基本上只是节点子节点的引用列表。但是,如果我需要将更改传播到此节点的父节点(并且此节点可以有多个父节点),我将需要一个对父节点的引用列表。
这可以接受吗?或者有更好的方法吗?维护两个列表(一个用于父母,一个用于孩子)是否有意义?我想将父母添加到相同的邻接列表中,但是这将为每个父子关系提供循环(即,parent-> child和child-> parent)。
答案 0 :(得分:2)
在每个节点中存储父指针永远不是必需,但这样做可以使事情运行得更快,因为您确切地知道在哪里查找父母。在你的情况下,这是完全合理的。
作为类比 - 二叉搜索树的许多实现将存储父指针,以便它们可以更容易地支持旋转(需要访问父节点)或删除(可能需要知道父节点)。类似地,一些更复杂的数据结构(如Fibonacci堆)在每个节点中使用父指针,以便更有效地实现减少键操作。
存储父母列表的内存开销并不会太糟糕 - 你现在基本上是对每个边缘进行重复计算:每个父节点都存储一个指向其子节点的指针,每个子节点都存储一个指向其父节点的指针。
希望这有帮助!