#动态规划 #记忆化 # #单线程 #缓存 #记忆 #

red_memo

一个简单、安全、单线程、纯Rust的记忆化和动态规划库

2个版本

0.1.1 2019年8月23日
0.1.0 2019年8月23日

#274 in 缓存

LGPL-3.0

11KB
184

red_memo是一个简单、安全、单线程、纯Rust的记忆化和动态规划库。

Memoizer<K,V>是主要的缓存类型。它可以初始化为底层的std::collections::HashMap使用new_hash(),或者使用底层的std::collections::BTreeMap使用new_ord()

键可以是有序的或哈希的。外部API在这两种情况下都是相同的,

为了使错误消息清晰易懂,需要Debug trait用于键和值。

为了满足用户对记忆化缓存的需求,需要Clone trait用于键。

需要Clone trait用于值。如果Memoizer返回对缓存值的不可变引用,就像通常那样,那么在从旧值计算新值时,缓存将不得不不可变借用,并且缓存不会更新新值。

如果值类型无法实现Clone,或者复制成本过高,请考虑使用std::rc::Rc


use red_memo::Memoizer;

fn fibonacci(mem: &mut Memoizer<usize, usize>, k: &usize) -> usize
{
    let k = *k;
    if k < 2 {
        k
    } else {
        mem.lookup(&(k - 1)) + mem.lookup(&(k - 2))
    }
}

fn main()
{
    let mut fib_cache = Memoizer::new_ord(fibonacci);
    // since usize implements Hash+Eq as well, this could instead be
    // let mut fib_cache = Memoizer::new_hash(fibonacci);
    println!("fibonacci(20) = {}", fib_cache.lookup(&20));
    assert_eq!(fib_cache.lookup(&40), 102334155);
}

无运行时依赖