#集合 #元素 #复制 #数字 #优化 #特质 #转换

已删除 David-set

适用于少量或大量Copy元素的优化集合

使用旧的 Rust 2015

0.1.2 2017年6月29日
0.1.1 2017年6月24日
0.1.0 2017年6月23日

#87 in #转换

MPL-2.0 许可证

37KB
899

Build Status Build status

David-set

这是一个针对实现了 Copy 特质的少量或大量元素进行空间和时间优化的集合。这个 Copy 约束很方便,但通过更多的工作,这个集合可以适用于任意类型(当然,支持 EqHash)。

最终它需要一个更好的名字。

要运行基准测试套件,请进入 bench 目录,然后运行

cargo +nightly run --release

如果已经通过 rustup 安装了 nightly rust,这应该可以工作。


lib.rs:

David-set 包含几个针对少量元素进行优化,同时在元素数量较多时也能很好地扩展大小和时间的集合。我们有两种集合类型

  1. Set 基本上可以与 HashSet 互换使用,尽管它要求其元素实现 Copy 特质,否则我就不得不学习编写正确的 unsafe 代码,这会很可怕。

  2. CastSet 对其元素的要求更严格,必须具有 Cast 特质。这适用于那些是 Copy,可以廉价地转换为 usize,并且足够均匀分布,不需要真正的哈希。基本上,这适用于您想存储数组索引集合的情况。所有基本整数类型都应该满足 Cast 特质。哦,这个集合还要求您的类型中有一个值是“无效的”。对于无符号整数类型,我们取它们的最大值作为无效值。这个约束使我们能够节省更多空间。

这两个集合类型在少量小元素的小集合上都不会进行堆分配。在 CastSet 进行任何堆分配之前,它可以存储多达 16 字节元素,而 Set 在不进行分配的情况下可以存储大小为 8 的集合。这两个集合通常比 HashSet 快大约两倍,尽管对于超过 8 个元素的集合,实际上 Set 的性能与 HashSet 相同。

示例

use david_set::Set;
let mut s: Set<usize> = Set::new();
s.insert(1);
assert!(s.contains(&1));
use david_set::CastSet;
let mut s: CastSet<usize> = CastSet::new();
s.insert(1);
assert!(s.contains(&1));

没有运行时依赖