18 个版本 (5 个破坏性更新)

0.6.0 2024 年 4 月 22 日
0.5.1 2024 年 3 月 8 日
0.4.0 2024 年 3 月 8 日
0.3.0 2023 年 12 月 7 日
0.1.9 2019 年 4 月 26 日

数据结构 中排名 224

Download history 167/week @ 2024-04-21 12/week @ 2024-04-28 6/week @ 2024-05-19 286/week @ 2024-07-28

每月下载量 286
用于 bytebraise

MIT 许可证

77KB
1.5K SLoC

nested_intervals

Crates.io docs.rs

此包处理可能重叠和嵌套的区间集合,即范围列表。

实现基于 Alekseyenko 等人 2007 年提出的嵌套包含列表,该实现提供与区间树相同的大 O 复杂度(O(n * log(n)) 构建,O(n + m) 查询)。查询数据结构的构建是懒加载的,并且只在依赖它的方法第一次被调用时发生。

每个区间都有一个附加的 u32 ids 向量,这使得可以将结果链接回其他数据结构。

完整的文档在 docs.rs。源代码在 GitHub

示例

代码示例

  fn test_example() {
        let intervals = vec![0..20, 15..30, 50..100];
        let mut interval_set = IntervalSet::new(&intervals);
        assert_eq!(interval_set.ids, vec![vec![0], vec![1], vec![2]]); // automatic ids, use new_with_ids otherwise
        let hits = interval_set.query_overlapping(10..16);
        assert_eq!(hits.intervals, [0..20, 15..30]);
        let merged = hits.merge_hull();
        assert_eq!(merged.intervals, [0..30]);
        assert_eq!(merged.ids, vec![vec![0,1]]);
    }

功能

尚不支持

我们目前不能

  • 找到最接近终点的区间

  • 找到左侧最接近点的区间 // 将会非常昂贵 O(n/2)

  • 找到右侧最接近点的区间 // 将会非常昂贵 O(n/2)

  • 交集两个区间集(即两个集合中的覆盖单位)

  • 交集多个区间集(即多个集合中的覆盖单位,可能应用 'k' 阈值)

  • 通过交集来合并内部重叠?这对于嵌套集来说是什么意思?

更新日志

  • 0.6.0 - 修复了 has_overlap 的一个错误,当数据集中有起始点相同的区间时,会产生假阴性。

依赖关系

~1MB
~18K SLoC