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数据结构


用于 deep_causality

MIT 许可证

31KB
521

ultragraph

Crates.io Docs.rs MIT licensed Audit Clippy Tests

📣 目标

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