2个版本
0.8.4 | 2022年3月12日 |
---|---|
0.8.3 | 2022年2月26日 |
#16 in #vertices
38KB
836 行
有关更多信息,请参阅crate文档。
lib.rs
:
创建用于处理DAGs的库,其中事先知道(即静态)图是有向的并且没有循环。对您的代码施加了一些假设
- DAG顶点是整数数字(
usize
),这可以简单地测试添加边是否会形成一个循环:边只能“向前”移动,即从u
到v
,如果u < v
。否则会崩溃。 - 顶点编号从0开始。
- 顶点数量在构建时确定,通常需要构建新的图才能增长或缩小。
作为这些假设的交换,您将获得以下有用的属性
- 正确性:无法表示循环(一个非法状态)。
- 紧凑性:边只是位集合中的位。实现只使用
(|V|*|V|-|V|)/2
位 内存 + 一个常数。 - CPU缓存局部性:边存储在按行优先填充的表示中,因此迭代顶点的邻居只是一个位集合中连续位的迭代。
- 认知开销低:不需要处理类型级别的杂技来完成任务。
- 渐近复杂度降低:生成一个随机DAG是一个
O(|E|)
操作。这实际上就是编写这个crate的初衷。它可以与 quickcheck 高效地一起使用。事实上,DirectedAcyclicGraph
实现了quickcheck::Arbitrary
(具有有意义的收缩)。
不支持特性
- 不支持在顶点中存储任何内容。
- 不支持为边或顶点分配权重。
- 不支持枚举顶点的进入边,只有出去的边。
- 没有serde实现。只需使用您选择的库序列化/反序列化边的列表。
入口点
查看 DirectedAcyclicGraph::empty
、DirectedAcyclicGraph::from_edges_iter
或 DirectedAcyclicGraph::from_adjacency_matrix
作为此crate的“入口点”。
依赖关系
~1.5MB
~28K SLoC