6 releases

0.3.2 Mar 8, 2020
0.3.1 Mar 8, 2020
0.2.0 Feb 9, 2020
0.1.1 Feb 1, 2020

#16 in #i64

Download history 78/week @ 2024-01-19 34/week @ 2024-01-26 32/week @ 2024-02-02 75/week @ 2024-02-09 90/week @ 2024-02-16 165/week @ 2024-02-23 136/week @ 2024-03-01 142/week @ 2024-03-08 91/week @ 2024-03-15 135/week @ 2024-03-22 149/week @ 2024-03-29 197/week @ 2024-04-05 140/week @ 2024-04-12 122/week @ 2024-04-19 121/week @ 2024-04-26 125/week @ 2024-05-03

528 downloads per month
Used in competitive-hpp

BSD-3-Clause

22KB
469 lines

memoise crate-name at crates.io crate-name at docs.rs

Simple memoization library for rust

Documentation

Find it on docs.rs.

Usage

Add this to your Cargo.toml:

[dependencies]
memoise = "0.3"

And then, just add memoise attribute to functions you want to memoise:

use memoise::memoise;

#[memoise(n <= 100)]
fn fib(n: i64) -> i64 {
    if n == 0 || n == 1 {
        return n;
    }
    fib(n - 1) + fib(n - 2)
}

And you can call it normally:

fn main() {
    println!("{}", fib(45));
}

And run it:

$ cargo build --release
$ time cargo run --release -q
1134903170

real    0m0.039s
user    0m0.000s
sys     0m0.016s

If comment out memoise attribute, it will not be memoised.

// #[memoise(n <= 100)]
fn fib(n: i64) -> i64 {
    if n == 0 || n == 1 {
        return n;
    }
    fib(n - 1) + fib(n - 2)
}
$ cargo build --release
$ time cargo run --release -q
1134903170

real    0m5.019s
user    0m4.984s
sys     0m0.016s

When no bounds for keys given, the cache table Vec will be allocated dynamically.

use memoise::memoise;

// the cache table for `n` is dynamically allocated
#[memoise(n)]
fn fib(n: i64) -> i64 {
    if n == 0 || n == 1 {
        return n;
    }
    fib(n - 1) + fib(n - 2)
}

_reset function frees allocated Vec.

fib(42); // This allocates cache table for `0..n+1`
fib_reset();

memoise_map memoises a function by using BTreeMap. It is suitable for keys are sparse.

#[memoise_map(n)]
fn fib(n: i64) -> i64 {
    if n == 0 || n == 1 {
        return n;
    }
    fib(n - 1) + fib(n - 2)
}

_reset function also releases all allocated memory.

For more information, you can find a document on docs.rs.

Dependencies

~1.5MB
~34K SLoC