搜索优化问题

时间:2011-09-13 15:07:05

标签: optimization data-structures

假设您有一个2D点列表,并为其指定了方向。将集合S定义为:

S={ (x,y,a) | (x,y) is a 2D point, a is an orientation (an angle) }.

给定S的元素s,我们将用s_p表示点部分,用s_a表示角度部分。我想知道是否存在一个有效的数据结构,在给定查询点q的情况下,能够返回S中的所有元素,以便

(dist(q_p, s_p) < threshold_1) AND (angle_diff(q_a, s_a) < threshold_2)   (1)

其中dist(p1,p2),p1,p2 2D点,是欧氏距离,angle_diff(a1,a2),a1,a2角,是角度之间的差(取最小值) 。数据结构应该是高效的w.r.t.元素的插入/删除和上面定义的搜索。载体的数量可以增长到10.000甚至更多,但需要一点点盐。

现在假设改变上述要求:不是使用条件(1),而是请求S的所有元素,使得给定距离函数d,我们希望S的所有元素都是d(q,s) &LT;阈。如果我记得很清楚,这最后的设置称为范围搜索。我不知道第一种情况是否可以在第二种情况下进行转换。

2 个答案:

答案 0 :(得分:1)

对于距离搜索,我认为最受欢迎的方法是二进制空间分区树。这可以存储为一系列位。每两位(对于二维树)或三位(对于三维树)将空间细分一层,从而提高分辨率。

使用BSP,定位一组对象来比较距离非常简单。只需找到包含距离框边缘的最小方块或立方体。

对于这个角度,我什么都不知道。我想你可以将每个对象存储在按其角度排序的第二个列表或树中。然后你可以使用BSP找到适当距离的每个物体,使用角度树以适当的角度找到每个物体,然后做一个交集。

答案 1 :(得分:0)

您已经有效地描述了“三维圆柱空间”,即。一个局部三维的空间,但其中一个维度是拓扑循环的。换句话说,它是局部平坦的,可以被建模为由(x,y,z,w)定义的四维对象C4的边界

z^2 + w^2 = 1

其中

a = arctan(w/z)

使用此模型,由约束定义的空间是围绕横截面楔形“纵向”缠绕的二维圆柱体,其中楔形物围绕4维圆柱形空间缠绕,角度为2 * threshold_2。这可以使用“修改的k-d树”方法(修改的3-d树)建模,其中数据结构不是树而是实际上是图(它具有循环)。您仍然可以将此空间划分为具有超平面分离的单元格,但沿正方向由(z,w)定义的曲线行进可能会遇到在负方向上遇到的点。应修改树以实际从两个方向引导这些节点,以便边缘是双向的(在z-w曲线方向 - 其他显然仍然是单向的。)

这些周期不会改变数据结构在定位附近点或允许约束搜索时的有效性。事实上,在大多数情况下,这些算法只是略微修改(最简单的方法是保持访问节点数据结构以防止搜索中的循环 - 您测试要搜索的下一个邻居)。

这对您的标准特别有效,因为您定义的区域实际上受到kd树的这些轴定义的超平面有界单元的限制,因此搜索终止将留下平均填充pi / 4的区域该地区的百分比。