是否有用于查找匹配任意范围的值的数据结构?

Is there a data structure for looking up values matching arbitrary ranges?

对于键相等查找,我们可以使用像hashmap这样的数据类型,但是有没有一种数据结构可以查找匹配任意范围的值?

下面的 Rust 代码使用 match 表达式模拟了这一点,但我希望不必在代码中对案例进行硬编码。

let x = 5;

match x {
    d if d <= 0 => println!("d <= 0"),
    d if 1 < d && d <= 3 => println!("1 < d <= 3"),
    d if 4 < d && d <= 6 => println!("4 < d <= 6"),
    _ => {}
}

(Rust playground)

您可以创建一个包含开始值和结束值的范围列表。按起始值对该列表进行排序。

当你得到一个查询时,对起始值进行二进制搜索。当您的值大于或等于起始值且小于或等于结束值时,您就知道您得到了正确的范围。

如果您的总范围相对较小(例如,从 1 到 1000 的整数),您可以预先填充一个范围引用数组。假设您有 4 个范围,可能的查询值为 0 到 10:

range1: 0, 2
range2: 3, 5
range3: 6, 8
range4: 7, 10

那么您的数组将是 [range1, range1, range1, range2, range2, range2, range3, range3, range3, range4, range4, range4, range4]

您可以将它扩展到您想要的任何大小,具体取决于您要花费多少内存。这样您就可以直接查找。