应用二进制搜索树查找Moore邻居



假设我有一大组坐标,如(3,4)(5,-6)等,其中xy是整数;可以用BST订购吗?

如何确定节点上应该有什么?

我之所以查看BST,而不是简单地使用坐标列表,是为了更有效地(相对于线性搜索)确定那些位于另一个的Moore邻域(Chebyshev距离1)的坐标。

我已经考虑过交替比较xy的值;这是个好办法吗?

我还能如何将BST应用于这种情况?或者使用BST是站不住脚的?

我建议您创建一个单元格网格。每个单元格(实际上是一个列表)都包含所有与其相似的坐标。

如果需要查找坐标的邻居,只需查看位于同一单元格(或相邻单元格)内的坐标即可。

尽管aioobe创建单元格网格(二维数组)的方法很简单,但存储所有可能的单元格/坐标的状态有点繁琐/效率低下,尤其是在我可能遇到的情况下,在一个很大的空间(稀疏数组)中只有少数实际坐标。

最终,我意识到使用BST是可行的(还有其他方法),这就是我所做的,通过使用平衡的BST来有效地找到Moore Neighbours:

  1. 在坐标上施加序数关系,即(x1,y1)>(x2,y2)=>(x1>x2)||(x1==x2&&y1>y2)
  2. 按该关系对坐标列表进行排序(以生成平衡树)
  3. 从排序列表中递归生成BST:插入中值元素作为节点,将中值下方和上方的列表切片,并将其作为参数传递给递归调用以生成左右子树

然后,为了搜索坐标的Moore邻居,我可以在O(logn)中查找/搜索树中的8个可能的邻居坐标(正如aioobe所建议的)。

最新更新