[英]How to find if a point is within a set of intervals?
我正在寻找最快的方法来决定一条线上的一个点是否在这一行的一个子集内。 我给了一个整数Point,我也有一个“列表”:
在这个例子中,如果我的点的值是5,那么我返回true,因为它包含在一个区间中,对于55也是如此。如果我的点等于1000,我也返回true,因为它匹配点列表。
我正在寻找一种快速的方法(比线性更快)来检查这种情况,而不必像可能的点那样实现尽可能多的整数(即,对于1:1000的间隔,我不想实现1000个整数)。 这可以在对数时间内完成吗?
谢谢
编辑:你可以认为任何时候预处理数据列表等于0,因为一旦我的初始间隔被处理,我需要将这个测试应用到10k点
如果排序的整数范围和范围不重叠,则可以执行二进制搜索以在对数时间内找到正确的范围。
该范围是否有任何限制? 基于此,你可以提出散列函数来恒定搜索。 但这取决于你的约束方式。
在反思之后,我认为以下代码应该在对数时间内工作,不包括构建映射所需的时间:
enum pointType {
point,
open,
close
};
std::map<long int, pointType> mapPoints;
mapPoints.insert(std::pair<long int, pointType>(3, point));
//create the 5:10 interval:
mapPoints.insert(std::pair<long int, pointType>(5, open));
mapPoints.insert(std::pair<long int, pointType>(10, close));
int number = 4;
bool inside = false;
std::map<long int, pointType>::iterator it1 = mapPoints.lower_bound(number);
if(it1->first == number || it1->second == close) {
inside = true;
}
我认为只要地图以非重叠的间隔正确填充,这就应该有效
首先检查点的hash_map。 这是简单的检查。
然后,只需按第一个坐标排序间隔图,然后找到该点的lower_bound。
然后检查您是否包含在返回的元素中。 如果你不在,那你就不在。
您可以在次线性时间内执行此操作GIVEN树数据结构(我建议使用B树),如果您不计算构建树所花费的时间(大多数树需要n log n或类似的时间来构建)。
如果你只有一个简单的列表,那么你不能比线性更好,因为在最坏的情况下你可能需要检查所有的点和间隔。
您可以使用布隆过滤器来测试点,看看它不是在一个时间间隔,以线性O(1)时间。 如果它通过了该测试,你必须使用另一种方法,例如二进制搜索,以查看它是否是O(log n)时间内的间隔的一部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.