34个稳定版本
2.1.0 | 2022年5月20日 |
---|---|
2.0.1 | 2022年3月27日 |
1.10.2 | 2021年12月31日 |
1.10.1 | 2021年2月7日 |
0.1.1 | 2017年12月1日 |
#965 在 数据结构 中排名
每月50次下载
在 6 个crate(3个直接) 中使用
36KB
895 行
摘要
一个库,提供了完整的二叉树访问者特质,包含常见的默认实现,例如dfs_inorder或dfs_preorder等访问策略。它还提供了两种完整的二叉树数据结构的实现,具有可变和不可变访问者,这些访问者实现了访问者特质。
lib.rs
:
摘要
一个库,提供了完整的二叉树访问者特质,包含对dfs_inorder或dfs_preorder等访问策略的默认实现。还提供了一些适配器,允许你在每次调用next()时映射、连接,或者可选地产生深度。它还提供了两种完整的二叉树数据结构的实现,具有可变和不可变访问者,这些访问者实现了访问者特质。一个按广度优先布局,另一个按深度优先布局。这两种布局都假设树中的每个节点都是相同类型的。
这是一个这个crate围绕的特质
pub trait Visitor:Sized{
type Item;
fn next(self)->(Self::Item,Option<[Self;2]>);
}
如果你有一个访问者,你可以调用next()来消费它,并产生正在访问的节点及其子节点的引用。
迭代器在调用next()时被消耗的事实允许我们返回可变引用,而不必担心用户以其他方式创建相同的可变引用。这个属性提供了一个安全地获取子节点可变引用的方法。这对于并行化分而治之风格的问题很有用。
目标
提供一个有用的完整二叉树访问者特质,它具有类似于Iterator特质的一些功能,如zip()和map(),并且可以用于并行分而治之风格的问题。
内存局部性
在dfs中对元素进行排序可能更适合分而治之的问题。我们希望快速访问的主要内存访问模式如下:如果我有父节点,我希望能够快速访问子节点。因此,我们希望子节点靠近父节点。而在bfs排序中,根节点的子节点实际上就在其旁边,但在树的倒数第二层节点中,子节点可能相距甚远(可能是n/2个元素远!)在dfs排序中,随着你向下遍历树,你将获得更好的局部性。
dfs排序的一个缺点是,如果叶节点没有使用所有空间,那么浪费的空间将散布在整个数据结构中。在bfs排序中,所有叶节点都位于数据结构的末尾,因此在遍历树时,内存局部性惩罚可能不会那么高。
对于并行分而治之,dfs排序可能比bfs排序更好。在dfs排序中,一旦解决问题被分解,每个任务处理的内存部分不会相交。而在bfs排序中,任务仍在操作交错内存部分。