2个版本
0.1.1 | 2019年8月23日 |
---|---|
0.1.0 | 2019年8月23日 |
#274 in 缓存
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);
}