15 个版本

使用旧的 Rust 2015

0.4.2 2018 年 5 月 30 日
0.4.1 2018 年 5 月 30 日
0.3.5 2018 年 5 月 30 日
0.3.4 2018 年 1 月 30 日
0.1.1 2016 年 6 月 12 日

数据结构 中排名 478

Download history 767/week @ 2024-03-14 604/week @ 2024-03-21 548/week @ 2024-03-28 661/week @ 2024-04-04 784/week @ 2024-04-11 933/week @ 2024-04-18 656/week @ 2024-04-25 692/week @ 2024-05-02 655/week @ 2024-05-09 837/week @ 2024-05-16 683/week @ 2024-05-23 718/week @ 2024-05-30 776/week @ 2024-06-06 676/week @ 2024-06-13 630/week @ 2024-06-20 530/week @ 2024-06-27

每月下载量 2,746
用于 11 包(9 个直接使用)

MIT/Apache

48KB
826 行(不包括注释)

disjoint-sets:三种并查集实现

Build Status Crates.io License: MIT License: Apache 2.0

变体包括

结构 元素类型 数据? 并发?
UnionFind vector 小整数
UnionFindNode 树节点
AUnionFind 数组 usize

所有三个都执行类似于 Tarjan 的 rank-balanced path compression,并使用内部可变性。

用法

它位于 crates.io,所以将其添加到您的 Cargo.toml

[dependencies]
disjoint-sets = "0.4.2"

并将其添加到您的 crate 根目录

extern crate disjoint_sets;

此 crate 支持 Rust 版本 1.15 及更高版本。

示例

使用 Kruskal 算法找到图的最小生成树

use disjoint_sets::UnionFind;

type Node = usize;
type Weight = usize;

struct Edge {
    dst: Node,
    weight: Weight,
}

type Graph = Vec<Vec<Edge>>;

fn edges_by_weight(graph: &Graph) -> Vec<(Node, Node, Weight)> {
    let mut edges = vec![];

    for (src, dsts) in graph.iter().enumerate() {
        for edge in dsts {
            edges.push((src, edge.dst, edge.weight));
        }
    }

    edges.sort_by_key(|&(_, _, weight)| weight);
    edges
}

fn mst(graph: &Graph) -> Vec<(Node, Node)> {
    let mut result = vec![];
    let mut uf = UnionFind::new(graph.len());

    for (src, dst, _) in edges_by_weight(graph) {
        if !uf.equiv(src, dst) {
            uf.union(src, dst);
            result.push((src, dst));
        }
    }

    result
}

fn main() {
    // Graph to use:
    //
    //  0 ------ 1 ------ 2
    //  |    6   |    5   |
    //  | 8      | 1      | 4
    //  |        |        |
    //  3 ------ 4 ------ 5
    //  |    7   |    2   |
    //  | 3      | 12     | 11
    //  |        |        |
    //  6 ------ 7 ------ 8
    //       9        10
    let graph = vec![
        // Node 0
        vec![ Edge { dst: 1, weight: 6 },
              Edge { dst: 3, weight: 8 }, ],
        // Node 1
        vec![ Edge { dst: 2, weight: 5 },
              Edge { dst: 4, weight: 1 }, ],
        // Node 2
        vec![ Edge { dst: 5, weight: 4 }, ],
        // Node 3
        vec![ Edge { dst: 4, weight: 7 },
              Edge { dst: 6, weight: 3 }, ],
        // Node 4
        vec![ Edge { dst: 5, weight: 2 },
              Edge { dst: 7, weight: 12 }, ],
        // Node 5
        vec![ Edge { dst: 8, weight: 11 }, ],
        // Node 6
        vec![ Edge { dst: 7, weight: 9 }, ],
        // Node 7
        vec![ Edge { dst: 8, weight: 10 }, ],
        // Node 8
        vec![ ],
    ];

    assert_eq! {
        vec![ (1, 4), (4, 5), (3, 6), (2, 5),
              (0, 1), (3, 4), (6, 7), (7, 8), ],
        mst(&graph)
    };
}

依赖关系

~170KB