Printing out nodes in a disjoint-set data structur

2019-04-12 02:22发布

问题:

I'm trying to do this exercise in Introduction to Algorithms by Cormen et al that has to do with the Disjoin Set data structure:

Suppose that we wish to add the operation PRINT-SET(x), which is given a node x and prints all the members of x's set, in any order. Show how we can add just a single attribute to each node in a disjoint-set forest so that PRINT-SET(x) takes time linear in the number of members of x's set, and the asymptotic running times of the other operations are unchanged. Assume that we can print each member of the set in O(1) time.

Now, I'm quite sure that the attribute needed is a tail pointer, so it can keep track of the children.

Since the disjoint set structure already has a parent attribute, find-set(x) can easily print out nodes going in one direction. But now, having a tail pointer, let's us go the other direction as well.

However, I'm not sure how I would write the algorithm to do this. If anyone could help me out in pseudocode, that would be much appreciated.

回答1:

Each node should have a next pointer to the next node in the set it is in. The nodes in a set should form a circular linked list.

When a singleton set is first created, the node's next pointer points to itself.

When you merge set with node X and set with node Y (and you've already checked that those sets are different by normalizing to set representatives), you merge the circular linked lists, which you can do by simply swapping X.next and Y.next; so this is a O(1) operation.

To list all the elements in the set containing node X, traverse the circular linked list starting from X.