#union-find #disjoint-set #fixed-size #no-std #dsu

no-std pulau-rs

为裸机环境提供的无分配union-find库

2个不稳定版本

0.2.0 2023年1月10日
0.1.0 2022年12月6日

#481 in 嵌入式开发

MIT 许可证

50KB
846

为裸机环境提供的无分配union-find库

该库提供了以下与 UnionFind 一起使用的算法。

  • QuickFind
  • QuickUnion
  • 加权QuickUnion
  • 带路径压缩的加权QuickUnion(默认)

设置

Cargo.toml 设置

[dependencies]
pulau-rs = "0.2.0"

渐近复杂度

算法 结构体 初始化 合并 查找 连接
QuickFind QuickFind O(N) O(N) O(1) O(1)
QuickUnion QuickUnion<false, false> O(N) O(N) O(N) O(N)
加权QuickUnion QuickUnion<ByRank, false> O(N) O(lg N) O(lg N) O(lg N)
带路径压缩的加权(Rank)QuickUnion QuickUnion<ByRank, true> O(N) Θ(α(N)) Θ(α(N)) Θ(α(N))
带路径压缩的加权(Size)QuickUnion QuickUnion<BySize, true> O(N) Θ(α(N)) Θ(α(N)) Θ(α(N))

*其中 α 是逆 Ackermann 函数

UnionFind的应用

  • 检查图中的连通分量
  • 检查图中的环
  • 在图像中搜索连通分量
  • 使用Kruskal找到最小生成树

示例用法

use pulau_rs::{UnionFind, QuickFind, QuickUnion, BySize};
fn make_uf_quickfind() {
    // construct with quickfind algorithm with fixed size 10
    let mut uf = UnionFind::<QuickFind, u32, 10, 0>::new();
}

fn make_uf_quickunion() {
    // construct weighted quickunion with path compression algorithm with fixed size 10
    let mut uf = UnionFind::<QuickUnion, u32, 10>::new();
    // construct weighted quickunion with path compression using size heuristics and fixed size 10
    let mut uf_with_sz = UnionFind::<QuickUnion<BySize>, u8, 10>::new();
    uf.union_sets(1,2);
    uf.union_sets(2,3);
    uf.union_sets(2,3);
    assert!(uf.connected(1, 3));
}

许可证

pulau-rs 在MIT许可证下授权(LICENSE-MIT 或 http://opensource.org/licenses/MIT

无运行时依赖