【问题标题】:Applying Binary Search Trees to find Moore Neighbours应用二叉搜索树寻找摩尔邻居
【发布时间】:2017-01-12 13:47:20
【问题描述】:

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

如何确定 left 与 right 节点上的内容?

我查看 BST 而不是简单地使用坐标列表的原因是,我可以更有效地(相对于线性搜索)确定位于另一个摩尔邻域(切比雪夫距离 1)中的那些坐标。

我考虑过交替比较 x 和 y 值;这是个好方法吗?

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

【问题讨论】:

    标签: binary-tree binary-search


    【解决方案1】:

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

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

    【讨论】:

    • 是否值得订购这些单元格?
    • 您可能想要订购它们,以便您可以轻松找到相邻的单元格。如果一个坐标位于单元格的边缘,则需要检查与相邻单元格中坐标的距离。我通常将它们放在一个二维数组中,这样我就可以通过 cells[x][y+1] 来查找相邻单元格中的坐标。
    【解决方案2】:

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

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

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

    然后要搜索坐标的摩尔邻居,我可以在 O(log n) 中查找/搜索树中的 8 个可能的邻居坐标(如 aioobe 建议的那样)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多