#slice #set-operations #sorting #set #operation #dedup

sdset

对排序和去重切片进行集合操作。性能极高!太棒了!

18个版本

0.4.0 2020年2月18日
0.3.6 2019年12月11日
0.3.4 2019年11月10日
0.3.2 2019年5月21日
0.3.0 2018年11月4日

#871算法

Download history 49/week @ 2024-03-11 27/week @ 2024-03-18 9/week @ 2024-03-25 39/week @ 2024-04-01 16/week @ 2024-04-08 16/week @ 2024-04-15 24/week @ 2024-04-22 15/week @ 2024-04-29 15/week @ 2024-05-06 20/week @ 2024-05-13 14/week @ 2024-05-20 25/week @ 2024-05-27 28/week @ 2024-06-03 16/week @ 2024-06-10 14/week @ 2024-06-17 24/week @ 2024-06-24

87 每月下载量

MIT 许可证

145KB
3K SLoC

SdSet

SdSet crate SdSet documentation

将集合理论应用于排序和去重切片。性能极高!太棒了!

API文档可在docs.rs上找到.

sdset 代表 sorted-deduplicated-slices-set,这有点太长了。

性能

关于测试的说明,测试在整数范围内进行,如果以

  • two_slices_big 结尾,第一个切片包含 0..100,第二个包含 1..101
  • two_slices_big2,第一个包含 0..100,第二个包含 51..151
  • two_slices_big3,第一个包含 0..100,第二个包含 100..200
  • three_slices_big,第一个包含 0..100,第二个包含 1..101,第三个包含 2..102
  • three_slices_big2,第一个包含 0..100,第二个包含 34..134,第三个包含 67..167
  • three_slices_big3,第一个包含 0..100,第二个有 100..200,第三个有 200..300

当这些整数运行切片重叠时,它们非常有用,我们可以看到当切片的不同部分重叠时性能如何变化。

有关“为什么没有真正的超大切片基准测试?”的更多信息,您可以查看 我在 /r/rust 上的回答

要运行基准测试,您必须启用 unstable 功能。

$ cargo bench --features unstable

请注意,sdset 集合操作不需要许多分配,因此它具有明显的优势。更多信息请参阅基准测试方差。

_btree 是使用两个或三个 BTreeSet 的基准测试,这些 BTreeSet 包含整数运行(见上文),不将 BTreeSet 的创建考虑在内。在集合上执行集合操作,并将结果累积到最终的 Vec 中。

_fnv 是使用两个或三个 HashSet 的基准测试,这些 HashSet 包含整数运行(见上文),它使用 一个名为 fnv 的自定义 Hasher,该哈希器针对小值如整数进行了优化,不将 HashSet 的创建考虑在内。在集合上执行集合操作,并将结果累积到最终的 Vec 中。

_vec 基准测试仅适用于并集集合操作,它由一个 Vec 组成,该 Vec 用两个或三个切片(见上文)的元素填充,排序并去重。

duomulti 测量是此crate的一部分实现,第一个只能对两个集合执行集合操作,第二个可用于任意数量的集合。

直方图

可以通过执行以下命令生成直方图:

$ export CARGO_BENCH_CMD='cargo bench --features unstable'
$ ./gen_graphs.sh xxx.bench

这使阅读统计信息更加容易,并可以看到 sdset 在已排序和去重的切片上比任何其他类型的集合都更加高效。

difference benchmarks

intersection benchmarks

union benchmarks

symmetric difference benchmarks

依赖项

~170KB