以线性时间打印出不相交的数据结构中的节点

时间:2014-04-08 18:15:00

标签: algorithm time-complexity clrs disjoint-sets union-find

我正在尝试在Cormen等人的算法导论中进行这项练习,该练习与Disjoin Set数据结构有关:

  

假设我们希望添加给定的操作PRINT-SET(x)   节点x并以任何顺序打印x集的所有成员。说明如何   我们可以在一个不相交的集合中为每个节点添加一个属性   林,以便PRINT-SET(x) 时间线性成员数量   x的集合,以及其他操作的渐近运行时间   没有改变。假设我们可以打印O(1)中的每个成员   时间。

现在,我非常确定所需的属性是尾指针,因此它可以跟踪孩子。

由于不相交的集合结构已经具有父属性,find-set(x)可以轻松打印出一个方向的节点。但现在,有一个尾指针,让我们走向另一个方向。

但是,我不确定如何编写算法来执行此操作。如果有人能用伪代码帮助我,那将非常感激。

1 个答案:

答案 0 :(得分:8)

每个节点都应该有一个next指针指向它所在的集合中的下一个节点。集合中的节点应该形成一个循环链表

首次创建单例集时,节点的next指针指向自身。

当您使用节点X合并set并使用节点Y进行设置时(您已经通过规范化设置代表检查了这些集合是否不同),您合并了循环链接列表,你可以简单地交换X.nextY.next;所以这是一个O(1)操作。

要列出包含节点X的集合中的所有元素,请从X开始遍历循环链表。