从二维的kd树中删除元素

时间:2010-03-09 10:08:37

标签: algorithm language-agnostic data-structures tree kdtree

我想扩展一个kd-tree(2D)类,以便能够删除节点(点)。应该在不必重建树的大部分的情况下执行此删除。幻灯片13中的这些slides中描述的算法似乎就是我所追求的。但是,我在幻灯片7中找到“findmin()”的描述时遇到了麻烦,它在节点删除算法中使用了。

问题

  1. “i”在倒数第二行意味着什么? (也许这是作者的错误,因为它没有在别处引用?)

  2. 究竟是什么“whichAxis”?它是我们想要离最近的分裂超平面的深度吗?

  3. 什么是“minimum()”,最小化?我虽然这是与轴的距离,但在我看来,作者正在尽量减少分数,这对我来说没有意义。

2 个答案:

答案 0 :(得分:4)

(1)我认为 是一个错字;在我的实现中我没有这样的东西,它似乎工作正常(着名的最后一句话......)。

(2) whichAxis 是你正在搜索最小值的平面。所以在二维数据中,它将是x或y。例如。对于点(20,40)和(40,20),一个是x中的最小值,另一个是y中的最小值。当您开始搜索替换节点时,您应该知道必须搜索哪个分割平面。

(3)幻灯片有点奇怪。您想在适当的平面中找到最小值。也许这会澄清一点(c#)。我的实现是针对使用eastings and northings作为x和y的数据集。 minAxis只是一个布尔,因为我只有两架飞机。

bool winner = minAxis ? (left.Easting < right.Easting) : (left.Northing < right.Northing);
return winner ? left : right;

...其中 left right 是从我们所在节点的左右子树递归搜索的最小值。我可以发布全功能,如果它更清楚: - )

答案 1 :(得分:2)

如果要删除给定kd-tree中的nodeA

(1)如果nodeA是叶节点,则将其设为null

(2)如果nodeA不是叶节点

Assume nodeA split by x , you have two choice

1. find the largest nodeB (whose X is the largest) in left   
2. find the minimum nodeB (whoes X is the minimum) in right  (This pdf prefer it)

注意:

如果你将nodeB等于nodeA在nodeA.right下,你应该选择2

如果你把nodeB等于nodeA.left下的nodeA,你应该选择1

之后,将nodeA替换为nodeB并删除nodeB。