#集合 #稀疏 #无符号整数 #稀疏集合

thinset

一种以速度为代价牺牲空间的稀疏无符号整数集合数据结构

4个版本 (破坏性更新)

0.4.0 2024年1月29日
0.3.0 2024年1月15日
0.2.0 2024年1月2日
0.1.0 2023年12月31日

#429数据结构

每月下载量 34次

MIT/Apache

48KB
903

thinset

一种针对稀疏无符号整数集合优化的数据结构。

crates.io Documentation Rust CI rustc 1.0+

Dependency Status Download Status

用法

将以下内容添加到您的Cargo.toml中

[dependencies]
thinset = "0.1"

描述

基于Briggs和Torczon于1993年发表的论文《稀疏集合的有效表示》实现的集合和映射,使用一对稀疏和密集数组作为后端存储。

当需要高效地跟踪来自大型宇宙的整数集合成员资格,但值相对分散时,此类集合很有用。

与标准库中的HashSet相比,清除集合是O(1)而不是O(n)。与基于位图的集合相比,集合的迭代与集合的基数(您拥有的元素数量)成比例,而不是与集合的最大大小成比例。

主要缺点是集合比其他集合实现使用更多的内存。

映射的行为与集合相同,除了它跟踪存储在集合中的值之外。在底层,SparseSet是键到值的SparseMap

下表比较了稀疏集合与位图集合的几个集合操作的渐近复杂度。n是集合中的元素数量,而u是集合宇宙的大小。

操作 稀疏集合 位图集合
插入 O(1) O(1)
删除 O(1) O(1)
查找 O(1) O(1)
清除 O(1) O(u)
计数 O(1) O(u)
迭代 O(n) O(u)
并集 O(n) O(u)
交集 O(n) O(u)
差集 O(n) O(u)
补集 O(n) O(u)

基准测试

以下基准测试是在2020年MacBook Pro上运行的,该电脑配备2 GHz英特尔酷睿i5处理器。

基准测试比较了SparseSet与标准库中的HashSet以及bit-set crate的BitSet

当从[0, 2^16)宇宙中插入1000个随机元素到集合中,然后迭代集合时,稀疏集合比HashSet4.1倍,比BitSet1.7倍

  • SparseSet: 160,329 ns/iter (+/- 55,664)
  • BitSet: 278,428 ns/iter (+/- 42,477)
  • HashSet:每迭代662,964纳秒(±56,851)

基准测试文件位于 examples/bench.rs,可以使用以下命令运行:

cargo run --example bench

示例

use thinset::SparseSet;

let mut s: SparseSet<usize> = SparseSet::new();
s.insert(0);
s.insert(3);
s.insert(7);

s.remove(7);

if !s.contains(7) {
    println!("There is no 7");
}

// Print 0, 1, 3 in some order
for x in s.iter() {
    println!("{}", x);
}
use thinset::{Pair, SparseMap};

let mut m: SparseMap<u32, u32> = SparseMap::new();

m.insert(13, 2);
m.insert(8, 16);

assert_eq!(m.get(13), Some(&2));
assert_eq!(m.get(6), None);

for Pair {key, value} in m.iter() {
    println!("{key}:{value}");
}

许可证

双许可,以兼容 Rust 项目。

许可协议为 Apache 许可证第 2 版:[https://apache.ac.cn/licenses/LICENSE-2.0](https://apache.ac.cn/licenses/LICENSE-2.0),或者 MIT 许可证:[http://opensource.org/licenses/MIT](http://opensource.org/licenses/MIT),任选其一。

依赖项

~155KB