Optimization 搜索优化问题

Optimization 搜索优化问题,optimization,data-structures,Optimization,Data Structures,假设您有一个指定了方向的二维点列表。将集合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中的所有元素s,从而 (dist(q_p, s_p) < threshold_1) AND (angle_diff(q_a, s_a) < threshol

假设您有一个指定了方向的二维点列表。将集合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中的所有元素s,从而

(dist(q_p, s_p) < threshold_1) AND (angle_diff(q_a, s_a) < threshold_2)   (1)
(距离(q_p,s_p)
其中,距离(p1,p2)和p1,p2 2D点是欧氏距离,角度_diff(a1,a2)和a1,a2角度是角度之间的差值(取最小值)。数据结构应为高效的w.r.t.元素插入/删除和上述定义的搜索。载体的数量可以增加到10.000或更多,但这是一个盐粒


现在假设更改上述要求:我们不使用条件(1),而是请求s的所有元素,这样,给定一个距离函数d,我们需要s的所有元素,使得d(q,s)对于距离搜索,我认为公认的最佳方法是二进制空间分区树。这可以存储为一系列位。每两位(对于2D树)或三位(对于3D树)将空间再细分一级,从而提高分辨率

使用BSP,定位一组要与之比较距离的对象非常容易。只需找到包含距离框边缘的最小正方形或立方体集


至于角度,我什么都不知道。我想您可以将每个对象存储在按角度排序的第二个列表或树中。然后,您将使用BSP在适当的距离处找到每个对象,使用角度树在适当的角度处找到每个对象,然后进行一组相交。

您已经有效地描述了“三维循环空间”,即局部三维但一维拓扑循环的空间。换言之,它是局部平坦的,并且可以建模为(x,y,z,w)中四维对象C4的边界,该边界由

z^2 + w^2 = 1
在哪里

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

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


这对于您的条件尤其有效,因为您定义的区域由k-d树的这些轴定义的超平面边界单元有效地限定,因此搜索终止将留下一个平均填充面积约为pi/4%的区域。

您是指“最小”的正方形(或立方体)吗包含距离盒吗?@Luke:他的解释对我来说很清楚。你的问题似乎令人困惑。