#disjoint-set #union-find #safe #merge-find

disjoint

不交集数据结构的快速且安全实现

8个版本 (破坏性)

0.8.0 2024年7月13日
0.7.0 2024年2月6日
0.6.0 2023年4月23日
0.5.0 2023年4月14日
0.1.0 2023年4月11日

284数据结构

Download history 7/week @ 2024-05-20 8/week @ 2024-05-27 9/week @ 2024-06-03 17/week @ 2024-06-10 31/week @ 2024-06-17 111/week @ 2024-06-24 138/week @ 2024-07-01 190/week @ 2024-07-08 65/week @ 2024-07-15 128/week @ 2024-07-22 115/week @ 2024-07-29 1/week @ 2024-08-05 15/week @ 2024-08-12

每月下载271次
用于 5 个crate(2个直接使用)

MIT/Apache

39KB
373

disjoint

Tests Coverage Crate Docs

此crate提供了在100%安全Rust中的快速不交集数据结构实现。

DisjointSet 是一个非常轻量级的不交集数据结构,没有附加到集合元素上的额外数据。如果您自己管理与元素相关的数据,并只想跟踪哪些元素被连接,请使用此数据结构。

DisjointSetVec<T>DisjointSetVec<T> 结合,因此它管理连续的数据条目 T 并跟踪哪些条目被连接。如果您希望不交集数据结构为每个元素包含一些额外的数据 T,请使用此数据结构。

示例

不交集数据结构可以应用于寻找无向边权图的最小生成树。让我们假设我们使用以下图形接口

    trait Edge : Copy {
        fn first_vertex(&self) -> usize;
        fn second_vertex(&self) -> usize;
    }
    
    trait Graph {
        type E : Edge;
        fn edges_ordered_by_weight(&self) -> Vec<Self::E>;
        fn number_vertices(&self) -> usize;
        fn new(edges: Vec<Self::E>) -> Self;
    }

然后使用提供的 DisjointSet 结构及其方法 is_joinedjoin 来实现克鲁斯卡尔算法以找到最小生成树。

use disjoint::DisjointSet;

fn minimum_spanning_forest<G : Graph>(graph: &G) -> G {
    let mut result_edges = Vec::new();
    let mut vertices = DisjointSet::new(graph.number_vertices());

    for edge in graph.edges_ordered_by_weight() {
        if !vertices.is_joined(edge.first_vertex(), edge.second_vertex()) {
            vertices.join(edge.first_vertex(), edge.second_vertex());
            result_edges.push(edge);
        }
    }
    
    Graph::new(result_edges)
}

我们甚至可以使用 join 返回 true 的事实(如果元素尚未连接),以进一步简化算法(这种变化有时称为快速并查集)

use disjoint::DisjointSet;

fn minimum_spanning_forest_quick_find<G : Graph>(graph: &G) -> G {
    let mut result_edges = Vec::new();
    let mut vertices = DisjointSet::new(graph.number_vertices());

    for edge in graph.edges_ordered_by_weight() {
        if vertices.join(edge.first_vertex(), edge.second_vertex()) {
            result_edges.push(edge);
        }
    }
    
    Graph::new(result_edges)
}

有关如何使用此crate的更多详细信息,请参阅文档

变更日志

此crate维护一个变更日志

许可

以下任一许可下授权:

由您选择。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交并包含在作品中的任何贡献,将双重许可,如上所述,无任何额外条款或条件。

无运行时依赖