从二维平衡 KD-Tree 中移除元素

Posted

技术标签:

【中文标题】从二维平衡 KD-Tree 中移除元素【英文标题】:Removing element from balanced KD-Tree of two dimensions 【发布时间】:2013-11-25 07:41:38 【问题描述】:

我想从平衡的 KD-Tree 中删除一个元素,并且 Tree 保持平衡而不重建整个树。这是否可以在不重建整棵树的情况下平衡树?如果是,那怎么办?

【问题讨论】:

到目前为止你尝试过什么?有什么效果?什么没有奏效?如果您还没有这样做,我建议您阅读the Stack Overflow question checklist。 en.wikipedia.org/wiki/K-d_tree。我读了这个。但不确定我是否在此之后删除元素,树是否保持平衡 【参考方案1】:

对于标准的 k-d 树,您可以删除项目,但没有重新平衡,因此如果您删除几乎所有项目,您最终可能会得到一个细长的不平衡树。你关心?这棵树实际上并没有变得更深:它是不平衡的,但是因为它在创建时是平衡的,所以它永远不会太深。

如果您只关心删除,则可以在删除一半项目后从头开始重建树 - 这意味着它永远不会失去平衡。此外,您可以考虑将项目标记为已删除而不是实际删除它们,这可以使一些事情变得更容易。

这是使数据结构动态化或动态化的一种特殊情况。以 log n 为代价,您可以使您知道如何重建但不平衡的数据结构是动态的,以应对插入和删除。基本思想是将动态数据结构构建为大小变化很大的非动态结构的集合,例如 2 的幂:大多数更改导致您仅重建一个或两个较小的非动态结构,但在更长的间隔,您将不得不花时间重建较大的间隔。一个非常松散的例子是将日常记录保存在活页笔记本中,并使用它们在一夜之间更新文件柜。参见例如http://wwwisg.cs.uni-magdeburg.de/ag/lehre/SS2009/GDS/slides/S12.pdf 或http://www.mpi-inf.mpg.de/~mehlhorn/ftp/mehlhorn27.pdf。

【讨论】:

以上是关于从二维平衡 KD-Tree 中移除元素的主要内容,如果未能解决你的问题,请参考以下文章

移除元素

从 DOM 中移除的元素中取消绑定事件

当不透明度为 0% 时从元素中移除点击

Play Framework 2.4.1:如何从 JsArray 中移除元素

18 怎样从一个数组中移除反复的元素

LeetCode 2091. 从数组中移除最大值和最小值