Skip to main content

A Python API for the Rust backend of `reunion`, i.e. a Union-Find w/ Rank data structure for Python.

Project description

A Disjoint-Set data structure (aka Union-Find w/ Rank)

What is Union-Find?

Suppose you have a collection S of elements e1, e2, ..., en, and wish to group them into different collections using operations:

  • "put ei and ej into the same group" (union),
  • "give me a representative of the group ei belongs to" (find).

Then a Union-Find data structure helps to store the underlying groups very efficiently and implements this API.

Note: The variant implemented uses Path Compression to further improve the performance.

(Some) Applications

  • Detect Cycles in Graph: Given a graph G, we can put the endpoints of edges into the same group (same connected component) unless there is a pair of endpoints (ei, ej) that share a group representative. If that happens, there was already a path existing between them, and adding this edge will add multiple paths, which cannot be the case for acyclic graphs.

  • Number of connected components in Graph: Given a graph G, put the endpoints of edges into the same group (same connected component). Once all nodes are exhausted, the number of groups formed is the number of connected components in G.

Some interesting lecture notes regarding Union-Find.

Usage

Setup

Using any of the package installers, install pyreunion from the PyPi.

For example, pip install pyreunion.

API

Example 1

Task: Create a UnionFind data structure of arbitrary size that contains usize at its elements. Then, union a few elements and capture the state of the data structure after that.

Solution:

import pyreunion


def main():

    # Create an empty UnionFind data structure.
    uf = pyreunion.UnionFind()

    print("Initial state:", uf.str())
    print("All elements form their own group (singletons).")
    print(uf.subsets())

    uf.union(2, 1)
    print("After combining the groups that contains 2 and 1:", uf.str())

    uf.union(4, 3)
    print("After combining the groups that contains 4 and 3:", uf.str())

    uf.union(6, 5)
    print("After combining the groups that contains 6 and 5:", uf.str())

    hs1 = {1, 2}
    hs2 = {3, 4}
    hs3 = {5, 6}

    subsets = uf.subsets()
    assert (len(subsets) == 3)

    assert (hs1 in subsets)
    assert (hs2 in subsets)
    assert (hs3 in subsets)

    uf.union(1, 5)

    print("After combining the groups that contains 1 and 5", uf.str())

    subsets = uf.subsets()
    assert (len(subsets) == 2)

    for x in hs1:
        hs3.add(x)

    assert (hs3 in subsets)
    assert (hs2 in subsets)

    # It is possible to iterate over the subsets.
    for partition in uf.subsets():
        print(partition)


if __name__ == '__main__':
    main()

Performance

The underlying implementation uses Path Compression and is written in Rust. The implementation and some performance statistics are available here.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyreunion-0.1.3.tar.gz (3.9 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pyreunion-0.1.3-cp39-cp39-manylinux_2_24_x86_64.whl (176.2 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.24+ x86-64

pyreunion-0.1.3-cp38-cp38-manylinux_2_24_x86_64.whl (176.2 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.24+ x86-64

File details

Details for the file pyreunion-0.1.3.tar.gz.

File metadata

  • Download URL: pyreunion-0.1.3.tar.gz
  • Upload date:
  • Size: 3.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/0.11.3

File hashes

Hashes for pyreunion-0.1.3.tar.gz
Algorithm Hash digest
SHA256 f043962e0e146d4615c4334f2f25be88a8295729da055f8199191e74e0d304b5
MD5 cbd1ef2e3274450c7809f0a13b7a73b9
BLAKE2b-256 495b506a35509c3140646b60c380deff8e220d14b0c8b6f9bc3ddef1f05269ef

See more details on using hashes here.

File details

Details for the file pyreunion-0.1.3-cp39-cp39-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for pyreunion-0.1.3-cp39-cp39-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 826316fddbe6f884d0e7bf8ca45813827497ec9635c810a7c9f342a9d39a8218
MD5 8b87aacabcb3d0057062c8c4c3876f1d
BLAKE2b-256 2b0f63a5c0af7db5d990a26eec40d361f5c90ea151e79ae6e72385d91899d897

See more details on using hashes here.

File details

Details for the file pyreunion-0.1.3-cp38-cp38-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for pyreunion-0.1.3-cp38-cp38-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 3b827431aafd6eb39e9c86e30b5b159312b2e94de41d902f599012f5a5f16c4a
MD5 4396b1a5db4e22a5202a7731b0f771bb
BLAKE2b-256 628439407486a424b2878d2e1aa2bfbfa5000e571e8acc443ab7e93fc23072eb

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page