Rust范围集合处理库range-collections的使用,高效管理区间操作与集合运算

Rust范围集合处理库range-collections的使用,高效管理区间操作与集合运算

关于

请参阅文档。

元数据

  • 版本:0.4.6
  • 发布时间:6个月前
  • 版本:2018 edition
  • 许可证:MIT OR Apache-2.0
  • 大小:28 KiB

安装

在项目目录中运行以下Cargo命令:

cargo add range-collections

或者将以下行添加到您的Cargo.toml中:

range-collections = "0.4.6"

所有者

  • Rüdiger Klaehn

分类

  • 数据结构

完整示例代码

use range_collections::{RangeSet, RangeSet2};

fn main() {
    // 创建一个空的范围集合
    let mut set = RangeSet2::new();
    
    // 添加范围到集合中
    set.insert(1..10);
    set.insert(15..20);
    
    // 检查范围是否包含特定值
    assert!(set.contains(5));
    assert!(!set.contains(12));
    
    // 合并重叠或相邻的范围
    set.insert(8..16);
    
    // 创建范围集合的补集
    let complement = set.complement();
    
    // 范围集合的交集操作
    let other_set = RangeSet2::from(5..18);
    let intersection = set.intersection(&other_set);
    
    // 范围集合的并集操作
    let union = set.union(&other_set);
    
    // 范围集合的差集操作
    let difference = set.difference(&other_set);
    
    // 迭代范围集合中的所有范围
    for range in set.iter() {
        println!("Range: {:?}", range);
    }
    
    // 检查范围集合是否为空
    assert!(!set.is_empty());
    
    // 获取范围集合的边界
    if let Some(bounds) = set.bounds() {
        println!("Bounds: {:?}", bounds);
    }
}
// 更复杂的示例:处理不连续的范围集合
use range_collections::{RangeSet, RangeSet2};

fn advanced_example() {
    // 从多个不连续的范围创建集合
    let mut complex_set = RangeSet2::from(vec![
        1..5,
        10..15,
        20..25
    ]);
    
    // 添加一个与现有范围重叠的新范围
    complex_set.insert(4..12);
    
    // 结果应该是合并后的范围:1..15, 20..25
    println!("Merged ranges: {:?}", complex_set.to_vec());
    
    // 移除一个范围
    complex_set.remove(8..22);
    
    // 结果应该是:1..8, 22..25
    println!("After removal: {:?}", complex_set.to_vec());
    
    // 对称差集操作
    let other_set = RangeSet2::from(vec![3..6, 18..23]);
    let symmetric_difference = complex_set.symmetric_difference(&other_set);
    
    println!("Symmetric difference: {:?}", symmetric_difference.to_vec());
}
// 使用RangeSet进行区间数学运算
use range_collections::{RangeSet, RangeSet2};
use std::ops::Range;

fn interval_math() {
    // 创建两个范围集合
    let set_a = RangeSet2::from(vec![1..10, 15..20]);
    let set_b = RangeSet2::from(vec![5..12, 18..25]);
    
    // 并集:1..12, 15..25
    let union = set_a.union(&set_b);
    
    // 交集:5..10, 18..20
    let intersection = set_a.intersection(&set_b);
    
    // 差集:1..5, 15..18
    let difference = set_a.difference(&set_b);
    
    // 检查是否包含另一个集合
    let contains = set_a.contains_set(&intersection);
    assert!(contains);
    
    // 检查是否不相交
    let disjoint = set_a.is_disjoint(&set_b);
    assert!(!disjoint);
}

1 回复

Rust范围集合处理库range-collections的使用指南

简介

range-collections是一个专门用于处理范围集合的Rust库,提供了高效的范围操作和集合运算功能。该库特别适合处理区间合并、交集计算、差集操作等场景,在数值范围处理、日程安排、资源分配等应用中非常实用。

主要特性

  • 范围合并与规范化
  • 集合运算(并集、交集、差集)
  • 范围查询与包含检测
  • 内存高效的范围存储
  • 迭代器支持

安装方法

在Cargo.toml中添加依赖:

[dependencies]
range-collections = "0.3"

基本使用方法

创建范围集合

use range_collections::{RangeSet, RangeSet2};

// 创建空的范围集合
let mut set = RangeSet2::new();

// 添加单个范围
set.insert(0..10);

// 添加多个范围
set.insert(20..30);
set.insert(40..50);

范围合并操作

use range_collections::RangeSet2;

let mut set = RangeSet2::new();
set.insert(0..10);
set.insert(5..15); // 自动合并重叠范围

println!("合并后的范围: {:?}", set);
// 输出: [0..15)

集合运算示例

use range_collections::RangeSet2;

// 创建两个范围集合
let mut set1 = RangeSet2::new();
set1.insert(0..20);
set1.insert(30..40);

let mut set2 = RangeSet2::new();
set2.insert(10..25);
set2.insert(35..45);

// 求交集
let intersection = set1.intersection(&set2);
println!("交集: {:?}", intersection);
// 输出: [10..20), [35..40)

// 求并集
let union = set1.union(&set2);
println!("并集: {:?}", union);
// 输出: [0..25), [30..45)

// 求差集
let difference = set1.difference(&set2);
println!("差集: {:?}", difference);
// 输出: [0..10), [30..35)

范围查询

use range_collections::RangeSet2;

let mut set = RangeSet2::new();
set.insert(0..10);
set.insert(20..30);

// 检查是否包含某个值
assert!(set.contains(5));
assert!(!set.contains(15));

// 检查是否包含整个范围
assert!(set.contains_range(2..8));
assert!(!set.contains_range(5..15));

迭代范围

use range_collections::RangeSet2;

let mut set = RangeSet2::new();
set.insert(0..5);
set.insert(10..15);

// 迭代所有范围
for range in set.iter() {
    println!("范围: {:?}", range);
}

// 获取所有不连续的范围段
let gaps = set.gaps();
for gap in gaps.iter() {
    println!("间隔: {:?}", gap);
}

完整示例demo

use range_collections::RangeSet2;

fn main() {
    // 示例1:创建和基本操作
    println!("=== 示例1:创建和基本操作 ===");
    let mut set = RangeSet2::new();
    
    // 添加多个范围
    set.insert(0..10);
    set.insert(20..30);
    set.insert(40..50);
    println!("初始范围集合: {:?}", set);
    
    // 添加重叠范围,测试自动合并
    set.insert(5..15);
    println!("合并后的范围集合: {:?}", set);
    
    // 示例2:集合运算
    println!("\n=== 示例2:集合运算 ===");
    let mut set_a = RangeSet2::new();
    set_a.insert(0..20);
    set_a.insert(30..40);
    
    let mut set_b = RangeSet2::new();
    set_b.insert(10..25);
    set_b.insert(35..45);
    
    // 求交集
    let intersection = set_a.intersection(&set_b);
    println!("集合A: {:?}", set_a);
    println!("集合B: {:?}", set_b);
    println!("交集: {:?}", intersection);
    
    // 求并集
    let union = set_a.union(&set_b);
    println!("并集: {:?}", union);
    
    // 求差集
    let difference = set_a.difference(&set_b);
    println!("差集: {:?}", difference);
    
    // 示例3:范围查询
    println!("\n=== 示例3:范围查询 ===");
    let query_set = RangeSet2::from(vec![0..10, 20..30]);
    
    // 检查单个值
    println!("包含数字5: {}", query_set.contains(5));
    println!("包含数字15: {}", query_set.contains(15));
    
    // 检查范围
    println!("包含范围2..8: {}", query_set.contains_range(2..8));
    println!("包含范围5..15: {}", query_set.contains_range(5..15));
    
    // 示例4:迭代器使用
    println!("\n=== 示例4:迭代器使用 ===");
    let iter_set = RangeSet2::from(vec![0..5, 10..15, 20..25]);
    
    println!("所有范围:");
    for range in iter_set.iter() {
        println!("  {:?}", range);
    }
    
    println!("所有间隔:");
    for gap in iter_set.gaps().iter() {
        println!("  {:?}", gap);
    }
    
    // 示例5:实际应用 - 时间区间管理
    println!("\n=== 示例5:时间区间管理 ===");
    let mut schedule = RangeSet2::new();
    
    // 添加已预订的时间段(以分钟为单位)
    schedule.insert(60..120);   // 10:00-11:00
    schedule.insert(180..240);  // 13:00-14:00
    
    // 检查新的时间段是否可用
    let new_booking = 100..160; // 10:40-13:20
    if schedule.intersection(&RangeSet2::from(vec![new_booking])).is_empty() {
        println!("时间段可用,可以预订");
    } else {
        println!("时间段已被占用,请选择其他时间");
    }
}

性能特点

range-collections使用平衡树结构存储范围,确保以下操作的高效性:

  • 插入和删除:O(log n)
  • 范围查询:O(log n + k),其中k是结果数量
  • 集合运算:O(n log n)

实际应用场景

  1. 时间区间管理:会议日程安排、资源预订系统
  2. 数值范围处理:价格区间过滤、数值分段统计
  3. 空间分区:地理区域划分、内存地址管理
  4. 数据压缩:连续值的压缩存储

注意事项

  • 范围默认使用左闭右开区间 [start, end)
  • 支持所有实现了Ord trait的类型
  • 空范围会被自动忽略
  • 反向范围(end < start)会导致panic

这个库为Rust开发者提供了强大而高效的范围处理能力,特别适合需要处理复杂区间操作的应用程序。

回到顶部