https://github.com/ruby/tsort
Topological sorting using Tarjan's algorithm
https://github.com/ruby/tsort
ruby
Last synced: about 1 year ago
JSON representation
Topological sorting using Tarjan's algorithm
- Host: GitHub
- URL: https://github.com/ruby/tsort
- Owner: ruby
- License: other
- Created: 2020-05-22T11:17:11.000Z (almost 6 years ago)
- Default Branch: master
- Last Pushed: 2024-09-10T06:13:08.000Z (over 1 year ago)
- Last Synced: 2025-02-25T02:14:20.896Z (about 1 year ago)
- Topics: ruby
- Language: Ruby
- Homepage:
- Size: 52.7 KB
- Stars: 10
- Watchers: 31
- Forks: 3
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
README
# TSort
TSort implements topological sorting using Tarjan's algorithm for
strongly connected components.
TSort is designed to be able to be used with any object which can be
interpreted as a directed graph.
TSort requires two methods to interpret an object as a graph,
tsort_each_node and tsort_each_child.
* tsort_each_node is used to iterate for all nodes over a graph.
* tsort_each_child is used to iterate for child nodes of a given node.
The equality of nodes are defined by eql? and hash since
TSort uses Hash internally.
## Installation
Add this line to your application's Gemfile:
```ruby
gem 'tsort'
```
And then execute:
$ bundle install
Or install it yourself as:
$ gem install tsort
## Usage
The following example demonstrates how to mix the TSort module into an
existing class (in this case, Hash). Here, we're treating each key in
the hash as a node in the graph, and so we simply alias the required
#tsort_each_node method to Hash's #each_key method. For each key in the
hash, the associated value is an array of the node's child nodes. This
choice in turn leads to our implementation of the required #tsort_each_child
method, which fetches the array of child nodes and then iterates over that
array using the user-supplied block.
```ruby
require 'tsort'
class Hash
include TSort
alias tsort_each_node each_key
def tsort_each_child(node, &block)
fetch(node).each(&block)
end
end
{1=>[2, 3], 2=>[3], 3=>[], 4=>[]}.tsort
#=> [3, 2, 1, 4]
{1=>[2], 2=>[3, 4], 3=>[2], 4=>[]}.strongly_connected_components
#=> [[4], [2, 3], [1]]
```
## Development
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
## Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/tsort.