#graph #edge #smol #node-index #to-the-point #edge-index

smol-graph

一个简单且直截了当的 Rust 图实现

5 个版本

0.2.1 2021年8月29日
0.2.0 2021年8月7日
0.1.2 2021年8月7日
0.1.1 2021年8月7日
0.1.0 2021年8月7日

#562 in 科学

MIT/Apache

8KB
73

smol-graph

一个简单且直截了当的 Rust 图实现。

它使用 Uuid 作为其索引(在 newtypes 内部)。这意味着可以生成一个已存在的 id,但这种情况的可能性几乎为零。

此软件包还提供了一个 prelude,导出此软件包中使用的所有类型:GraphNodeIndexEdgeIndex

示例

用法:首先将其添加到您的 Cargo.toml 中,然后在项目中使用它。

// Import the few types this library exports.
use smol_graph::prelude::*;
// Or do it explicitely.
use smol_graph::{
    Graph, Edge, EdgeIndex, NodeIndex,
};

创建一个新的图

use smol_graph::Graph;

// Convience function:
let graph: Graph<(), ()> = Graph::new();

// Or alternately, explicit field filling.
// This could be used for with capacity or prefilled maps, for example.
use std::collections::HashMap;
let graph: Graph<(), ()> = Graph {
    nodes: HashMap::new(),
    edges: HashMap::new(),
};

插入节点和边

use smol_graph::{Graph, Edge};

let mut graph: Graph<i32, String> = Graph::new();

// Insert nodes and get their indices.
let one = graph.node(1);
let two = graph.node(2);
// or do it with field access
let three = {
    use smol_graph::NodeIndex;
    
    let idx = NodeIndex::new();
    graph.nodes.insert(idx, 3);
    idx
};

// And then for edges:
let a = graph.edge(Edge::new((one, two), String::from("a")));
// Or with field access:
let b = {
    use smol_graph::EdgeIndex;

    let idx = EdgeIndex::new();
    let edge = Edge {
        nodes: (two, three),
        data: String::from("b"),
    };
    graph.edges.insert(idx, edge);
    idx
};

删除节点或边

use smol_graph::{Graph, Edge};

let mut graph = Graph::new();
let a = graph.node(5);
let b = graph.node(6);
let edge = graph.edge(Edge::new((a, b), ()));

// Watch out, the edge still points to the node that doesn't exist.
graph.r_node(a).unwrap();
graph.r_node(b).unwrap();
// And then remove the edge.
graph.r_edge(edge).unwrap();

注意

  • 它使用 Uuid 作为索引。这意味着,尽管几乎不可能,但可能会生成重复的索引。有关更多信息,请参阅 https://en.wikipedia.org/wiki/Universally_unique_identifier

  • 该图由 std hashmap 支持,用于节点和边。虽然这可能在所有情况下都不是最好的,但它肯定是最简单的一种。

  • 它不会检查指向有效节点的边。虽然可以实现这一点,但此库的目标是拥有一个小型且易于使用的图类型,检查节点需要设计决策,这留给了用户。

依赖项

~285–445KB