我正在寻找最快的方法来判断一条线上的点是否在此线的子集内。 我得到一个整数Point,我也有一个“列表”:
在这个例子中,如果我的点的值是5,那么我返回true,因为它包含在一个区间中,相同的是55.如果我的点等于1000,我也返回true,因为它匹配的列表分。
我正在寻找一种快速的方法(比线性更快)来检查这种情况,而不必产生与可能的点一样多的整数(即,对于1:1000的间隔,我不想实现1000整数)。 这可以在对数时间内完成吗?
由于
编辑: 您可以认为,预处理数据列表所花费的任何时间都等于0,因为一旦我的初始间隔被处理,我需要将此测试应用于10k点
答案 0 :(得分:11)
嗯,也许你可以使用间隔或段树:
答案 1 :(得分:4)
如果您对整数范围进行了排序且范围不重叠,则可以执行二进制搜索以在对数时间内找到正确的范围。
范围是否有任何限制?基于此,你可以提出散列函数来恒定搜索。但这取决于你的约束条件。
答案 2 :(得分:2)
反思之后,我认为以下代码应该以对数时间工作,不包括构建地图所需的时间:
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;
}
我认为只要地图以非重叠间隔正确填充
,这就应该有效答案 3 :(得分:0)
首先检查点的hash_map。这是简单的检查。
然后只需按第一个坐标排序间隔图,然后找到该点的lower_bound。
然后检查您是否包含在返回的元素中。如果你不在,那你就不在。
答案 4 :(得分:0)
你可以在次线性时间内做到这一点GIVEN一个树数据结构(我推荐一个B树),如果你不计算构建树所花费的时间(大多数树需要n log n或类似的时间到建)。
如果你只有一个简单的列表,那么你不能做比线性更好的,因为在最坏的情况下你可能需要检查所有的点和间隔。
答案 5 :(得分:0)
您可以使用Bloom Filter测试某个点,并在线性O(1)时间内查看某个点中的不是。如果它通过了该测试,你必须使用另一种方法,例如二进制搜索,看看它是否是O(log n)时间内的间隔的一部分。