4 个版本
0.1.3 | 2023年4月25日 |
---|---|
0.1.2 | 2022年11月6日 |
0.1.1 | 2022年3月12日 |
0.1.0 | 2022年3月1日 |
#791 in 数据结构
每月 43 次下载
35KB
630 行
TreeFlat 是为 Rust 构建和遍历前序树的最简单方式。
Alpha 版本!
如果你以前序方式构建并显示 Tree
,那么这就是你的树。
无额外冗余,只是一个简单且高效的单一技巧马。
注意:树依赖于构建顺序,因此无法以不同的顺序重新排序树(更改父级或层级)。因此,例如,你不能在中间添加一个分支(只能添加在末尾之后...)。
工作原理
它不是创建节点指针的树、嵌套枚举或基于嵌套 Arena
-based ids
的树,而只是存储树的表示
. Users
├── jhon_doe
├ ├── file1.rs
├ ├── file2.rs
├── jane_doe
└────── cat.jpg
... 在三个向量中按前序扁平化,这些向量存储数据、级别和父级
数据 | 用户 | jhon_doe | file1.rs | file2.rs | jane_doe | cat.jpg |
---|---|---|---|---|---|---|
层级 | 0 | 1 | 2 | 2 | 1 | 2 |
父级 | 0 | 0 | 1 | 1 | 0 | 4 |
这允许在最常见的操作(关键:推入项 + 迭代)上获得 Rust Vec
的性能,并且非常有效地迭代 node::Node::parents
/node::Node::children
/node::Node::siblings
,因为它只需遍历扁平向量。
迭代器利用这些观察结果
- 子节点在父节点的右侧/上方
- 父节点在子节点的左侧/下方
- 兄弟节点在同一个层级上
因此,在导航 jhon_doe
的子节点的情况下
. Users ⇡ parents
├── jhon_doe Index: 1, Level: 1
⇩ children start at
jhon_doe + 1,
level > jhon_doe
├ ├── file1.rs : Level 2 is child!
├ ├── file2.rs : Level 2 is child!
├── jane_doe : Level 1 is below, stop!
└────── cat.jpg
有了这个,你不需要搜索可能很大的数组,可以直接跳过节点并迭代直到节点上方!。
示例
use tree_flat::prelude::*;
let mut tree = Tree::with_capacity("Users", 6);
let mut root = tree.tree_root_mut();
let mut child = root.push("jhon_doe");
child.push("file1.rs");
child.push("file2.rs");
let mut child = root.push("jane_doe");
child.push("cat.jpg");
//The data is backed by vectors and arena-like ids on them:
assert_eq!(
tree.as_data(),
["Users", "jhon_doe", "file1.rs", "file2.rs", "jane_doe", "cat.jpg",]
);
assert_eq!(tree.as_level(), [0, 1, 2, 2, 1, 2,]);
assert_eq!(tree.as_parents(), [0, 0, 1, 1, 0, 4,]);
//Pretty print the tree
println!("{}", tree);
// Iterations is as inserted:
for f in &tree {
dbg!(f);
}
更多信息请访问我的 博客 .
受演讲启发
“高性能树处理,APL 方式” -- Aaron Hsu - APL Wiki
🤝 贡献
欢迎贡献、问题和功能请求!
表达你的支持
如果你喜欢这个项目!或者想要帮助使我的项目成为现实,请考虑通过https://www.buymeacoffee.com/mamcx捐赠或赞助我的工作。