我正在寻找一个解决方案,我有一组优先考虑的位置。
我想删除较低优先级的位置,以使剩余位置不在任何位置的特定距离(比如100米)内。
答案 0 :(得分:3)
k-d tree听起来非常适合这个问题。
如果您要删除绝大多数的点,从最高优先级的点开始最有意义,并且对于每个点,执行类似于最近邻搜索的操作(在树中找到一个由给定距离限定的点后停止检查是否插入点。
您可能希望在此过程中尝试找到自平衡变体或偶尔重新平衡树,因为不平衡的树会导致操作缓慢。
如果剩下很大一部分点,最好将所有点插入树中以开始并进行修改的最近邻搜索(忽略点本身,以距离为界)从最低优先级,并在我们去的时候删除相关点。
使用适当的构造技术,您可以从一开始构建平衡树。
插入和删除在平衡树中采用O(log n)(一种简单的删除方法是在节点中设置"删除"标志,但这并不能使树较小)和O(n)在不平衡树中。最近邻搜索类似,但即使对于平衡树也可能需要达到O(n),但这是最坏的情况 - 平均而言应该更接近O(log n)。
k-d树是二叉树,其中每个节点都是k维点。每个非叶节点都可以被认为是隐式生成分裂超平面,该超平面将空间划分为两个部分,称为半空间。该超平面左侧的点由该节点的左子树表示,超平面右侧的点由右子树表示。以下面的方式选择超平面方向:树中的每个节点与k维度中的一个相关联,超平面垂直于该维度的轴。因此,例如,如果对于特定的拆分," x"选择轴,子树中的所有点都用较小的" x"值比节点出现在左子树中,所有点都带有更大的" x"值将在右子树中。在这种情况下,超平面将由点的x值设置,其法线将是单位x轴。
在k-d树中搜索最近邻居的过程如下:
- 从根节点开始,算法以递归方式向下移动树,其方式与插入搜索点时相同(即,它向左或向右移动,具体取决于点是否小于或大于拆分维度中的当前节点。)
- 一旦算法到达叶节点,它就会将该节点指定为当前最佳的"
- 算法展开树的递归,在每个节点执行以下步骤:
- 如果当前节点比当前节点更接近,那么它将成为当前最佳节点。
- 该算法检查在分割平面的另一侧是否可能存在比当前最佳点更接近搜索点的任何点。在概念上,这通过使分裂超平面与搜索点周围的超球面相交来完成,该超球面具有等于当前最近距离的半径。由于超平面都是轴对齐的,因此将其实现为简单的比较,以查看搜索点的分割坐标与当前节点之间的距离是否小于从搜索点到当前最佳的距离(总坐标)。
- 如果超球面穿过平面,则平面另一侧可能有更近的点,因此算法必须从当前节点向下移动树的另一个分支,寻找更近的点,遵循相同的递归过程。整个搜索。
- 如果超球面不与分裂平面相交,则算法继续向上走树,并消除该节点另一侧的整个分支。
- 当算法完成根节点的此过程时,搜索就完成了。
醇>
答案 1 :(得分:0)
我假设您打算删除位置,从优先级最低的位置开始,距离另一个位置一定距离。
您可以使用quad tree来表示相对位置。这个想法是你构造一个树,每个节点有四个孩子。每个子项代表一个象限,当您添加每个位置时,您将遍历树。如果您点击了一个无子节点,那么您将创建新的子节点,再次表示该区域分为四个区域,直到每个位置都在其自己的区域中。
创建此树后,您可以将位置之间的每次距离检查的样本大小减少到仅限于某个深度内的距离,并且只减少附近象限内的位置。
然而,此方法近似并且不保证您检查跨越整个主要象限的位置,但是它确实有效地允许您远距离检查附近的大多数位置,从而有效地减少了运行时间。为了解决这个问题,您可以使用相同的数据创建多个四叉树,并略有偏移,但当然每个四叉树将成为运行时间中的乘数因子,因为您将单独构建和检查每个树。
这会回答你的问题吗?