#tree-structure #tree #generational-arena #arena #generational #tree-node #index

no-std generational-indextree

基于索引而非引用计数指针的索引树结构

9个稳定版本

1.1.4 2022年1月15日
1.1.3 2022年1月10日
1.1.2 2020年12月2日
1.1.1 2020年6月20日
1.0.2 2020年4月6日

#824 in 数据结构


用于 2 crates

MIT 协议

80KB
857

generational-indextree

License MIT Crates.io doc.rs dependency status

支持删除节点的基于索引树结构

这种索引树结构仅使用一个 GenerationalArena 和索引,而不是引用计数指针。这意味着没有 RefCell,并且可变性通过独特 (&mut) 访问方式在Rust中处理得更加地道。树可以像 Vec 一样发送或跨线程共享。这使一般的多进程支持,如并行树遍历成为可能。

致谢

这个crate是从indextree crate分叉出来的,但是用generational arena来存储节点,而不是Vec。这使得我们可以删除节点并使用空余位置来插入新节点,而不会受到ABA问题的困扰,如generational-arena crate中所述。

我们为了改进删除节点API而牺牲了indextree中的rayon支持。

这个包是从优秀的 https://github.com/saschagrunert/indextree crate分叉出来的。后端存储被替换为 https://github.com/fitzgen/generational-arena,以改进删除节点和复用空间的支持。

示例用法

use generational_indextree::Arena;

// Create a new arena
let arena = &mut Arena::new();

// Add some new nodes to the arena
let a = arena.new_node(1);
let b = arena.new_node(2);

// Append a to b
assert!(a.append(b, arena).is_ok());
assert_eq!(b.ancestors(arena).into_iter().count(), 2);

变更日志

版本 日期 变更
1.1.4 15-01-2022 更精简的调试输出,修复了 !std 支持,改进了测试流程
1.1.3 10-01-2022 修复了 serde 功能标志,感谢 Tal Liberman 的 MR。通过 Chris Laplante 添加了 new_node_with 方法,允许自引用数据
1.1.2 02-12-2020 与 indextree 版本 4.3.1 同步
1.1.1 20-06-2020 与 indextree 版本 4.1.0 同步
1.1.0 16-06-2020 与 indextree 版本 4.0.0 同步
1.0.0 05-04-2020 使用 GenerationArena 的 indextree

依赖项

~230KB