## table of contents

struct::disjointset(3tcl) | Tcl Data Structures | struct::disjointset(3tcl) |

# NAME¶

struct::disjointset - Disjoint set data structure# SYNOPSIS¶

package require**Tcl 8.4**

package require **struct::disjointset ?1.0?**

**::struct::disjointset** *disjointsetName*

*disjointsetName* *option* ?*arg arg ...*?

*disjointsetName* **add-partition** *elements*

*disjointsetName* **partitions**

*disjointsetName* **num-partitions**

*disjointsetName* **equal** *a* *b*

*disjointsetName* **merge** *a* *b*

*disjointsetName* **find** *e*

*disjointsetName* **destroy**

# DESCRIPTION¶

This package provides*disjoint sets*. An alternative name for this kind of structure is

*merge-find*.

Normally when dealing with sets and their elements the question is "Is this element E contained in this set S?", with both E and S known.

Here the question is "Which of several sets contains the
element E?". I.e. while the element is known, the set is not, and we
wish to find it quickly. It is not quite the inverse of the original
question, but close. Another operation which is often wanted is that of
quickly merging two sets into one, with the result still fast for finding
elements. Hence the alternative term *merge-find* for this.

Why now is this named a *disjoint-set* ? Because another way
of describing the whole situation is that we have

- a finite
*set*S, containing - a number of
*elements*E, split into - a set of
*partitions*P. The latter term applies, because the intersection of each pair P, P' of partitions is empty, with the union of all partitions covering the whole set. - An alternative name for the
*partitions*would be*equvalence classes*, and all elements in the same class are considered as equal.

Here is a pictorial representation of the concepts listed above:

+-----------------+ The outer lines are the boundaries of the set S. | / | The inner regions delineated by the skewed lines | * / * | are the partitions P. The *'s denote the elements | * / \ | E in the set, each in a single partition, their |* / \ | equivalence class. | / * \ | | / * / | | * /\ * / | | / \ / | | / \/ * | | / * \ | | / * \ | +-----------------+

For more information see
*http://en.wikipedia.org/wiki/Disjoint_set_data_structure*.

# API¶

The package exports a single command,**::struct::disjointset**. All functionality provided here can be reached through a subcommand of this command.

**::struct::disjointset***disjointsetName*- Creates a new disjoint set object with an associated global Tcl command
whose name is
*disjointsetName*. This command may be used to invoke various operations on the disjointset. It has the following general form:

*disjointsetName**option*?*arg arg ...*?- The
**option**and the*arg*s determine the exact behavior of the command. The following commands are possible for disjointset objects:

*disjointsetName***add-partition***elements*- Creates a new partition in specified disjoint set, and fills it with the
values found in the set of
*elements*. The command maintains the integrity of the disjoint set, i.e. it verifies that none of the*elements*are already part of the disjoint set and throws an error otherwise.The result of the command is the empty string.

*disjointsetName***partitions**- Returns the set of partitions the named disjoint set currently consists of.
*disjointsetName***num-partitions**- Returns the number of partitions the named disjoint set currently consists of.
*disjointsetName***equal***a**b*- Determines if the two elements
*a*and*b*of the disjoint set belong to the same partition. The result of the method is a boolean value,**True**if the two elements are contained in the same partition, and**False**otherwise.An error will be thrown if either

*a*or*b*are not elements of the disjoint set. *disjointsetName***merge***a**b*- Determines the partitions the elements
*a*and*b*are contained in and merges them into a single partition. If the two elements were already contained in the same partition nothing will change.The result of the method is the empty string.

*disjointsetName***find***e*- Returns the partition of the disjoint set which contains the element
*e*. *disjointsetName***destroy**- Destroys the disjoint set object and all associated memory.

# BUGS, IDEAS, FEEDBACK¶

This document, and the package it describes, will undoubtedly contain bugs and other problems. Please report such in the category*struct :: disjointset*of the

*Tcllib Trackers*[http://core.tcl.tk/tcllib/reportlist]. Please also report any ideas for enhancements you may have for either package and/or documentation.

When proposing code changes, please provide *unified diffs*,
i.e the output of **diff -u**.

Note further that *attachments* are strongly preferred over
inlined patches. Attachments can be made by going to the **Edit** form of
the ticket immediately after its creation, and then using the left-most
button in the secondary navigation bar.

# KEYWORDS¶

disjoint set, equivalence class, find, merge find, partition, partitioned set, union# CATEGORY¶

Data structures1.0 | tcllib |