Skip to main content

Implementation of Tarjan's algorithm: resolve cyclic deps

Project description

Python implementation of Tarjan’s algorithm

Tarjan’s algorithm takes as input a directed (possibly cyclic!) graph and returns as output its strongly connected components in a topological order.

Example

https://raw.githubusercontent.com/bwesterb/py-tarjan/master/doc/example.png
>>> tarjan({1:[2],2:[1,5],3:[4],4:[3,5],5:[6],6:[7],7:[8],8:[6,9],9:[]})
[[9], [8, 7, 6], [5], [2, 1], [4, 3]]

Uses

Cyclic dependencies

In various cases, dependencies might be cyclic and a group of interdependant actions must be executed simultaneously. It is not uncommon that the simulataneous execution is costly. With Tarjan’s algorithm, one can determine an efficient order in which to execute the groups of interdependant actions.

Transitive closure

Using Tarjan’s algorithm, one can efficiently compute the transitive closure of a graph. (Given a graph G, the transitive closure of G is a graph that contains the same vertices and contains an edge from v to w if and only if there is a path from v to w in G.)

The transitive closure is implemented in tarjan.tc:

>>> from tarjan.tc import tc
>>> tc({1:[2],2:[1,5],3:[4],4:[3,5],5:[6],6:[7],7:[8],8:[6,9],9:[]})
{1: (1, 2, 5, 6, 7, 8, 9),
 2: (1, 2, 5, 6, 7, 8, 9),
 3: (3, 4, 5, 6, 7, 8, 9),
 4: (3, 4, 5, 6, 7, 8, 9),
 5: (8, 9, 6, 7),
 6: (8, 9, 6, 7),
 7: (8, 9, 6, 7),
 8: (8, 9, 6, 7),
 9: ()}

Expand group hierarchies

Given a graph of groups, one can use the transitive closure to determine all indirect members of a group. (Someone is an indirect member of a group, if it is a member of a group that is a member of a group that … is a member of the group.)

Installation

Simply execute

pip install tarjan

or from this source distribution, run

python setup.py install
https://travis-ci.org/bwesterb/py-tarjan.png

Tarjan Changelog

0.2.4 (2023-04-14)

  • Support Python 3.8 - 3.11

  • Drop support for Python 2.6, 3.2 - 3.7

  • Change license to LGPLv3

  • Switch to Github actions

  • Add flake8 linting

0.2.3.2 (2016-12-28)

  • Python 3.6 support

0.2.3.1 (2015-11-22)

  • Python 3.4 & 3.5 support

0.2.3 (2015-02-19)

  • Fix packaging bug [#6]

0.2.2 (2015-02-18)

  • Removed dynamic version specifier

  • Converted docs to rst for better docs on pypi

Thanks-to: Patrick Gerken (github.com/d03cc)

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

tarjan-0.2.4.tar.gz (7.3 kB view details)

Uploaded Source

File details

Details for the file tarjan-0.2.4.tar.gz.

File metadata

  • Download URL: tarjan-0.2.4.tar.gz
  • Upload date:
  • Size: 7.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.3

File hashes

Hashes for tarjan-0.2.4.tar.gz
Algorithm Hash digest
SHA256 a9d7e93368c8c75d33b0849801f2687a59c91e0ae487b8ba7e97e431e841a514
MD5 fb24e431897d870b7719b2569c2c24da
BLAKE2b-256 4aec37c4395138b8307daf910d30e0aa77c854e7a83d4900799ace460e89bbf9

See more details on using hashes here.

Supported by

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