6个版本
0.5.2 | 2024年1月14日 |
---|---|
0.5.1 | 2023年9月6日 |
0.5.0 | 2023年8月30日 |
0.4.6 | 2023年8月17日 |
#434 在 数据结构
31KB
521 行
ultragraph
📣 目标
Ultragraph旨在通过添加更多功能(如直接从图中存储和检索节点、获取节点的所有邻居以及一些基本算法,如最短路径)来简化与有向图数据结构的工作。
🎁 特性
- 在图中直接存储节点以方便访问
- 访问图中的所有节点和边(get_node & get_all_nodes)
- 访问节点的所有邻居(outgoing_edges)
- 最短路径算法
⚡️ 实现
- 底层封装petgraph
- 在矩阵图中存储关系,在hashmap中存储节点
- 通过存储特持模式支持多种实现
- 添加了适当的错误处理
🚀 安装
只需运行
cargo add ultragraph
或者,将以下内容添加到您的Cargo.toml中
ultragraph = "current_version"
⭐ 用法
查看
use ultragraph::prelude::*;
#[derive(Default, Debug, Copy, Clone, Hash, Eq, PartialEq)]
pub struct Data {
x: u8,
}
pub fn main() {
let mut g = ultragraph::with_capacity::<Data>(10);
// Add nodes to the graph
let root_index = g.add_root_node(Data { x: 3 });
let node_a_index = g.add_node(Data { x: 7 });
let node_b_index = g.add_node(Data { x: 9 });
let node_c_index = g.add_node(Data { x: 11 });
// Link nodes together
// Link root node to node a
let res = g.add_edge(root_index, node_a_index);
assert!(res.is_ok());
// Link node a to node b
let res = g.add_edge(node_a_index, node_b_index);
assert!(res.is_ok());
// Link node root to node c
let res = g.add_edge(root_index, node_c_index);
assert!(res.is_ok());
// Get node a
let node = g.get_node(node_a_index);
assert!(node.is_some());
let data = node.unwrap();
assert_eq!(data.x, 7);
// get all outgoing_edges of root node
let neighbors = g.outgoing_edges(root_index).unwrap();
// root node has 2 outgoing_edges: node a and node b
assert_eq!(neighbors.len(), 2);
// neighbors is just a vector of indices
// so you can iterate over them to get the actual nodes
println!("Neighbors of root node: ");
for n in neighbors{
let node = g.get_node(n).unwrap();
println!("node: {:?}", node);
}
}
🙏 致谢
本项目受到以下项目的启发
👨💻👩💻 贡献
欢迎贡献,尤其是与文档、示例代码和修复相关的内容。如果您不确定从哪里开始,只需打开一个问题并提问。
除非您明确表示,否则您提交给deep_causality的任何有意贡献都应按MIT许可证许可,不附加任何额外条款或条件。
📜 许可证
本项目按MIT许可证许可。
💻 作者
- Marvin Hansen,GitHub。
- Github GPG密钥ID: 369D5A0B210D39BC
- GPG指纹: 4B18 F7B2 04B9 7A72 967E 663E 369D 5A0B 210D 39BC
依赖项
~3.5MB
~58K SLoC