如何查找某个点是否在一组间隔内?

时间:2012-04-12 19:49:37

标签: c++ c algorithm computational-geometry

我正在寻找最快的方法来判断一条线上的点是否在此线的子集内。 我得到一个整数Point,我也有一个“列表”:

  1. 点数,由整数(3,10,1000等)
  2. 表示
  3. 间隔,我用2个整数表示(2:10是2到10的所有整数,50:60等)
  4. 在这个例子中,如果我的点的值是5,那么我返回true,因为它包含在一个区间中,相同的是55.如果我的点等于1000,我也返回true,因为它匹配的列表分。

    我正在寻找一种快速的方法(比线性更快)来检查这种情况,而不必产生与可能的点一样多的整数(即,对于1:1000的间隔,我不想实现1000整数)。 这可以在对数时间内完成吗?

    由于

    编辑: 您可以认为,预处理数据列表所花费的任何时间都等于0,因为一旦我的初始间隔被处理,我需要将此测试应用于10k点

6 个答案:

答案 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)时间内的间隔的一部分。