是否有用于查找匹配任意范围的值的数据结构?
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"),
_ => {}
}
您可以创建一个包含开始值和结束值的范围列表。按起始值对该列表进行排序。
当你得到一个查询时,对起始值进行二进制搜索。当您的值大于或等于起始值且小于或等于结束值时,您就知道您得到了正确的范围。
如果您的总范围相对较小(例如,从 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]
。
您可以将它扩展到您想要的任何大小,具体取决于您要花费多少内存。这样您就可以直接查找。
对于键相等查找,我们可以使用像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"),
_ => {}
}
您可以创建一个包含开始值和结束值的范围列表。按起始值对该列表进行排序。
当你得到一个查询时,对起始值进行二进制搜索。当您的值大于或等于起始值且小于或等于结束值时,您就知道您得到了正确的范围。
如果您的总范围相对较小(例如,从 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]
。
您可以将它扩展到您想要的任何大小,具体取决于您要花费多少内存。这样您就可以直接查找。