#directed-acyclic-graph #graph #dag #bit-set #matrix #vertices #edge

dag

以严格上三角矩阵形式存储在位集合中,表示整数字符的有向无环图

2个版本

0.8.4 2022年3月12日
0.8.3 2022年2月26日

#16 in #vertices

GPL-3.0 许可证

38KB
836

将表示为有向无环图 (DAGs) 的严格上三角矩阵

有关更多信息,请参阅crate文档


lib.rs:

将表示为有向无环图 (DAGs) 的严格上三角矩阵

创建用于处理DAGs的库,其中事先知道(即静态)图是有向的并且没有循环。对您的代码施加了一些假设

  1. DAG顶点是整数数字(usize),这可以简单地测试添加边是否会形成一个循环:边只能“向前”移动,即从uv,如果u < v。否则会崩溃。
  2. 顶点编号从0开始。
  3. 顶点数量在构建时确定,通常需要构建新的图才能增长或缩小。

作为这些假设的交换,您将获得以下有用的属性

  • 正确性:无法表示循环(一个非法状态)。
  • 紧凑性:边只是位集合中的位。实现只使用(|V|*|V|-|V|)/2 内存 + 一个常数。
  • CPU缓存局部性:边存储在按行优先填充的表示中,因此迭代顶点的邻居只是一个位集合中连续位的迭代。
  • 认知开销低:不需要处理类型级别的杂技来完成任务。
  • 渐近复杂度降低:生成一个随机DAG是一个 O(|E|) 操作。这实际上就是编写这个crate的初衷。它可以与 quickcheck 高效地一起使用。事实上,DirectedAcyclicGraph 实现了 quickcheck::Arbitrary(具有有意义的收缩)。

不支持特性

  • 不支持在顶点中存储任何内容。
  • 不支持为边或顶点分配权重。
  • 不支持枚举顶点的进入边,只有出去的边。
  • 没有serde实现。只需使用您选择的库序列化/反序列化边的列表。

入口点

查看 DirectedAcyclicGraph::emptyDirectedAcyclicGraph::from_edges_iterDirectedAcyclicGraph::from_adjacency_matrix 作为此crate的“入口点”。

依赖关系

~1.5MB
~28K SLoC