回答
A k-d tree听起来很适合这个问题。
如果你删除了绝大多数的点,它可能使最有意义,从具有最高优先级的点开始,并为每个点,做类似的近邻搜索的东西(停止一旦我们得到由给定距离限定的点),以检查是否插入点。
您可能需要尝试查找自动平衡变体或在此过程中偶尔重新平衡树,因为不平衡树会导致操作速度变慢。
如果有很大一部分点将保留下来,最好将所有点插入树中,以便从最低点开始修改最近邻点搜索(忽略点本身,以距离为界)在我们走的时候优先考虑并删除相关的要点
使用适当的施工技术,您可以从一开始就构建平衡树。
插入和删除需要O均衡树(log n)的(一个简单的方法来删除是刚刚设置的节点的“删除”标志,但这并不永远做树更小)和O(n)在不平衡的树中。最近邻居搜索是相似的,尽管即使对于平衡树也可能会花费O(n),但这是最差的情况 - 平均而言,它应该更接近于O(log n)。
k-d树是一个二叉树,其中每个节点都是一个k维点。每个非叶节点都可以被认为是隐式地生成一个分裂超平面,该空间将空间分成两部分,称为半空间。该超平面左侧的点由该节点的左侧子树表示,超平面的点右侧由右侧子树表示。超平面方向的选择方式如下:树中的每个节点都与其中一个k维关联,超平面与该维的轴垂直。因此,例如,如果对于特定分割选择“x”轴,具有比该节点更小的“x”值的子树中的所有点将出现在左子树中,并且具有更大“x”值的所有点将是在正确的子树中。在这种情况下,超平面将由该点的x值设置,其法线将为单位x轴。
搜索在kd树收益的近邻如下:
- 根节点开始,算法递归地向下移动的树,以同样的方式,它会如果正在插入搜索点(即,根据点是否小于或大于拆分维中的当前节点,向左或向右)。
- 一旦算法到达叶节点,它保存该节点点为“当前最佳”
- 该算法解开树的递归,在每个节点处执行以下步骤:
- 如果当前节点比当前最好的接近,那么它就成为当前最好的。
- 该算法检查分裂平面中距离搜索点较近的另一侧是否存在任何点。在概念上,这是通过将分裂超平面与具有半径等于当前最近距离的搜索点周围的超球体相交来完成的。由于超平面都是轴对齐的,因此将其作为简单比较来实现,以查看搜索点的分割坐标与当前节点之间的距离是否小于从搜索点到当前最佳点的距离(总体坐标)。
- 如果超球面穿过平面,平面另一侧可能会有更近的点,所以算法必须从当前节点向下移动树的另一个分支,寻找更近的点,遵循相同的递归处理为整个搜索。
- 如果超球面不与分裂平面相交,则算法继续向上走树,并且该节点另一侧的整个分支被消除。
- 当算法结束本过程对于根节点,则搜索完成。
我假设你打算删除位置,从最低优先级的位置开始,距离另一个位置有一定的距离。
您可以使用quad tree来表示相对位置。这个想法是,你构造一棵树,每个节点有四个孩子。每个孩子代表一个象限,当你添加每个位置时,你遍历树。如果您击中无孩子的节点,那么您将创建新的子节点,再次表示划分为四个区域的同一区域,直到每个位置都在其自己的区域中。
创建此树后,您可以将每个位置之间的距离检查的样本大小减少到仅限于特定深度内的距离,并且仅限附近象限内的位置。
这种方法是但近似和不保证您检查跨越整个主象限的位置,但它确实有效地让你距离检查大部分地区被附近有效地降低了运行时间。为了解决这个问题,您可以使用相同的数据创建多个具有轻微偏移的四叉树,但是当然,每个四叉树将在运行时成为倍增因子,因为您将逐个构建并检查每个树。
这是回答您的问题吗?
- 1. Java - 从位置集合中获取基于距离的位置
- 2. 计算距离位置的距离 - iPhone
- 3. 检测iPhone是否位于Raspberry Pi的近距离范围内
- 4. 从GPS位置计算距离
- 5. 用户的位置距离我目前的位置的距离
- 6. 计算距离范围
- 7. 计算我的位置到多个位置的距离
- 8. 从初始位置,方位和距离得到的位置
- 9. 计算用户位置和固定位置之间的距离
- 10. 如何查找道路距离圆范围内的位置名称?
- 11. 修剪集合用于计算距离
- 12. JSON和位置距离计算
- 13. 位置“越野”时计算距离
- 14. 位置指针和距离计算
- 15. 定位范围内的一个范围
- 16. Swift MKMapItems距用户的距离位置
- 17. 从我当前位置到另一个位置的距离
- 18. 范围内的图像位置
- 19. 查找范围内的数字位置
- 20. 基于位置的范围搜索
- 21. 从3位数字计算范围内的任意数字的算法000000-999999
- 22. 算法模位集合
- 23. 设置基于范围的内容位置
- 24. 从FF/Webkit中的像素位置创建合拢范围
- 25. 按特定距离查找距离目标位置最近的位置
- 26. 地理位置距离
- 27. mysql lat lon计算显示半径范围内的位置
- 28. 计算2个位置之间的距离并计算价格
- 29. 在jQuery中为长距离短距离设置动画位置
- 30. 计算Java中多个地理位置之间的距离
因此,删除从最低优先级的位置开始的位置,使得没有位置在任何其他位置的距离d内?我理解正确吗? – Neil
位置集由500万个位置组成。删除最低优先级的位置,然后检查所有剩余位置中的任何位置是否在距离d到任何其他位置的距离内都将花费昂贵。 –
我同意,但如果你想要一个完全准确的算法,我认为确定所有点之间的距离是不可避免的。它是否必须完全准确或允许“快捷方式”? – Neil