4 个版本
0.2.1 | 2024 年 2 月 13 日 |
---|---|
0.2.0 | 2024 年 2 月 12 日 |
0.1.1 | 2023 年 5 月 20 日 |
0.1.0 | 2023 年 5 月 20 日 |
4 in #disjoint-set
21KB
229 代码行
UFRush
UFRush 是 Rust 中并查集(Disjoint-Set)数据结构的一种无锁、线程安全的实现。该数据结构允许高效地计算等价关系(以不相交集合表示),并支持以下操作:`find`、`unite` 和 `same`。
背景
并查集数据结构提供了一种高效的方法来管理集合的分割,分割成不相交的子集。它支持两个主要操作:合并(将两个子集合并为一个)和查找(确定特定元素属于哪个子集)。
无锁编程,或非阻塞编程,是一种在并发计算中应用的方法,其中多个线程操作和修改共享数据,而不需要锁。无锁编程通过使用可以独立执行而不受中断的原子操作来实现其目标。在 UFRush 的上下文中,无锁意味着多个线程可以并发地对并查集结构执行操作,系统保证至少有一个线程会取得进展,从而提高多线程环境中的吞吐量和性能。
UFRush 中使用的算法基于 Richard J. Anderson 和 Heather Woll 的研究论文 "Wait-Free Parallel Algorithms for the Union-Find Problem"。
方法
UFRush 提供以下方法
-
new(size: usize) -> Self
创建一个具有指定元素数量的新的并查集数据结构。 -
size() -> usize
返回并查集结构中的元素总数。 -
same(x: usize,y: usize) -> bool
确定元素 `x` 和 `y` 是否属于同一子集。 -
find(x: usize) -> usize
查找 `x` 属于的子集的代表性元素。 -
unite(x: usize,y: usize) -> bool
将包含 `x` 和 `y` 的子集合并。 -
clear()
清除并查集结构,使每个元素成为一个单独的子集。
使用方法
以下是使用 UFRush 的示例
let n = 10;
let uf = UFRush::new(n);
uf.unite(0, 1);
uf.unite(1, 2);
uf.unite(3, 4);
uf.unite(5, 6);
uf.unite(6, 7);
uf.unite(7, 8);
// Test if these elements are in the same set
assert!(uf.same(0, 2)); // true, as 0 and 2 are connected through 1
assert!(uf.same(3, 4)); // true
assert!(uf.same(5, 8)); // true, as 5, 6, 7, and 8 are all connected
// Test some elements that are not in the same set
assert!(!uf.same(0, 3)); // false, as there is no connection between 0 and 3
assert!(!uf.same(2, 5)); // false
// Now, we connect some additional elements
uf.unite(2, 5);
// And re-test
assert!(uf.same(0, 5)); // true, as now 0 and 5 are connected through 1->2->5
测试
UFRush 包含全面的单元测试,包括多线程使用的测试。
使用以下命令运行测试
cargo test
免责声明
请注意,尽管已经尽最大努力确保UFRush库的准确性、完整性和可靠性,但开发者不对该库的内容或功能做出任何保修、保证或承诺(明示或暗示)。
库的实现基于复杂的无锁编程技术,据开发者所知,该实现是正确的。然而,由于无锁编程的固有复杂性,可能存在尚未发现的未知问题或边缘情况。因此,该库提供“原样”交付,不提供任何形式的保修。
开发者声明对使用UFRush库造成的任何直接或间接、特殊或偶然的损害概不负责。鼓励库的用户在其特定用例中彻底测试和验证其性能和正确性。
如果发现任何问题,请提交包含复现错误的详细步骤的问题报告。以代码改进或建议形式的贡献始终受到欢迎。
最后,虽然UFRush库旨在在多线程环境中提供高性能,但重要的是要理解实际性能可能根据具体的工作负载特性和硬件配置而有所不同。鼓励用户在其自己的工作负载下进行性能测试,以确保该库满足其性能要求。
许可证
本项目遵循MIT许可证 - 请参阅LICENSE文件以获取详细信息。