#interval-tree #rb-tree #augmented-tree

rb-interval-map

rb-interval-map 是基于区间树的数据结构

1 个不稳定版本

新功能 0.1.2 2024 年 8 月 22 日
0.1.1 2024 年 8 月 22 日
0.1.0 2024 年 8 月 22 日

#587数据结构

Apache-2.0

99KB
2.5K SLoC

interval_map

interval_map 是基于区间树的数据结构。它完全实现了红黑树插入和删除功能,确保每次修改操作最多需要 $O(logN)$ 时间复杂度。

interval_map 中区间树的实现参考了 "算法导论"(第 3 版,第 14.3 节:区间树,第 348-354 页)。

为了在 Rust 中安全高效地处理插入和删除操作,interval_map 创新性地 使用数组来模拟指针,用于管理红黑树中的父子引用。这种方法也确保了 interval_map 具有代码SendUnpin 特性,允许它在线程之间安全传输,并在异步操作期间保持固定的内存位置。

interval_map 实现了一个 IntervalMap 结构体

  • 它接受 Interval<T> 作为键,其中 T 可以是任何实现 Ord 特性的类型。因此,允许区间如 $[1, 2)$ 和 $["aaa", "bbb")$
  • 值可以是任何类型

interval_map 支持 insertdeleteiter 函数。遍历按 Interval<T> 的顺序进行。例如,对于类型 Interval<u32>

  • $[1,4)<[2,5)$,因为 $1<2$
  • $[1,4)<[1,5)$,因为 $4<5$

所以 IntervalMap 中区间的顺序是 $[1,4)<[1,5)<[2,5)$。

目前,interval_map 只支持半开区间,即 $[...,...)$。

基准测试

基准测试在一个具有 AMD R7 7840H + DDR5 5600MHz 的平台上进行。结果如下

  1. 只有插入
    插入 100 1000 10, 000 100, 000
    总时间 5.4168 µs 80.518 µs 2.2823 ms 36.528 ms
  2. 插入 N 和删除 N
    insert_and_remove 100 1000 10, 000 100, 000
    总时间 10.333 µs 223.43 µs 4.9358 ms 81.634 ms

待办事项

  • 支持$(...,...)$, $[...,...]$和$(...,...]$区间类型。目前无法支持这些区间类型而不影响性能。
  • 为区间添加Point类型要支持Point类型,还应支持$[...,...]$,因此目前也无法支持。但您可以参考以下示例代码:examples/new_point
  • 添加更多测试,例如etcd
  • 优化iter模块。

依赖项

~165KB