4 releases (2 breaking)
|0.3.1||Jan 30, 2021|
|0.3.0||Sep 2, 2020|
|0.2.0||Jul 29, 2020|
|0.1.0||Aug 7, 2018|
#702 in Algorithms
305,947 downloads per month
Used in 415 crates (via textwrap)
SMAWK Algorithm in Rust
This crate contains an implementation of the SMAWK algorithm for finding the smallest element per row in a totally monotone matrix.
The SMAWK algorithm allows you to lower the running time of some algorithms from O(n²) to just O(n). In other words, you can turn a quadratic time complexity (which is often too expensive) into linear time complexity.
Finding optimal line breaks in a paragraph of text is an example of an algorithm which would normally take O(n²) time for n words. With this crate, the running time becomes linear. Please see the textwrap crate for an example of this.
Add this to your
[dependencies] smawk = "0.3"
You can now efficiently find row and column minima. Here is an example where we find the column minima:
use smawk::smawk_column_minima; let matrix = vec![ vec![3, 2, 4, 5, 6], vec![2, 1, 3, 3, 4], vec![2, 1, 3, 3, 4], vec![3, 2, 4, 3, 4], vec![4, 3, 2, 1, 1], ]; let minima = vec![1, 1, 4, 4, 4]; assert_eq!(smawk_column_minima(&matrix), minima);
minima vector gives the index of the minimum value per column,
minima == 1 since the minimum value in the first column is 2
(row 1). Note that the smallest row index is returned.
This crate has an optional dependency on the
crate, which provides an efficient matrix
implementation. Enable the
ndarray Cargo feature to use it.
Version 0.3.1 (2021-01-30)
This release relaxes the bounds on the
online_column_minima functions so that
they work on matrices containing floating point numbers.
- #55: Relax bounds to
- #56: Update dependencies to their latest versions.
- #59: Give an example of what SMAWK does in the README.
Version 0.3.0 (2020-09-02)
This release slims down the crate significantly by making
- #45: Move non-SMAWK code and unit tests out of lib and into separate modules.
- #46: Switch
smawk_column_minimafunctions to a new
- #47: Make the
dependency on the
- #48: Let
Matrixargument instead of
- #50: Remove mandatory
Version 0.2.0 (2020-07-29)
This release updates the code to Rust 2018.
- #18: Make
online_column_minimageneric in matrix type.
- #23: Switch to the Rust 2018 edition. We test against the latest stable and nightly version of Rust.
- #29: Drop strict Rust 2018 compatibility by not testing with Rust 1.31.0.
- #32: Fix crash on
- #33: Update
randdependency to latest version and get rid of
- #34: Bump
version-syncdependencies to latest versions.
- #35: Drop unnecessary Windows tests. The assumption is that the numeric computations we do are cross-platform.
- #36: Update
ndarraydependency to the latest version.
- #37: Automate publishing new releases to crates.io.
Version 0.1.0 — August 7th, 2018
First release with the classical offline SMAWK algorithm as well as a newer online version where the matrix entries can depend on previously computed column minima.
SMAWK can be distributed according to the MIT license. Contributions will be accepted under the same license.