应用二叉搜索树查找摩尔邻居

时间:2012-03-22 12:34:24

标签: binary-tree binary-search

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

如何确定 left vs right 节点应该是什么?

我之所以看BST而不是简单地使用坐标列表,是因为我可以更有效地(与线性搜索相比)确定那些将在另一个的摩尔邻域(Chebyshev距离1)中的坐标。

我考虑过与xy值进行交替比较;这是一个好方法吗?

我如何才能将BST应用于这种情况?或者使用BST难以维持?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

尽管aioobe创建一个单元网格(二维数组)的方法很简单,但是存储所有可能的单元格/坐标的状态有点沉重/低效,特别是当我可能有某些情况下在一个非常大的空间(稀疏数组)中只有少数实际坐标。

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

  1. 对坐标施加顺序关系,即(x1,y1)> (x2,y2)=> (x1> x2)|| (x1 == x2&& y1> y2)
  2. 按该关系对坐标列表进行排序(以生成平衡树)
  3. 递归生成排序列表中的BST:插入中间元素作为节点,将列表切入下方和中位数上方,并作为参数传递给递归调用以生成左右子树
  4. 然后,为了搜索坐标的摩尔邻居,我可以在O(log n)中查找/搜索树中的8个可能的邻居坐标(如aioobe建议的那样)。