我正在尝试在Cormen等人的算法导论中进行这项练习,该练习与Disjoin Set数据结构有关:
假设我们希望添加给定的操作
PRINT-SET(x)
节点x
并以任何顺序打印x
集的所有成员。说明如何 我们可以在一个不相交的集合中为每个节点添加一个属性 林,以便PRINT-SET(x)
时间线性成员数量x
的集合,以及其他操作的渐近运行时间 没有改变。假设我们可以打印O(1)中的每个成员 时间。
现在,我非常确定所需的属性是尾指针,因此它可以跟踪孩子。
由于不相交的集合结构已经具有父属性,find-set(x)
可以轻松打印出一个方向的节点。但现在,有一个尾指针,让我们走向另一个方向。
但是,我不确定如何编写算法来执行此操作。如果有人能用伪代码帮助我,那将非常感激。
答案 0 :(得分:8)
每个节点都应该有一个next
指针指向它所在的集合中的下一个节点。集合中的节点应该形成一个循环链表。
首次创建单例集时,节点的next
指针指向自身。
当您使用节点X
合并set并使用节点Y
进行设置时(您已经通过规范化设置代表检查了这些集合是否不同),您合并了循环链接列表,你可以简单地交换X.next
和Y.next
;所以这是一个O(1)
操作。
要列出包含节点X
的集合中的所有元素,请从X
开始遍历循环链表。