【问题标题】:Is kd-tree always balanced?kd-tree 总是平衡的吗?
【发布时间】:2015-11-20 04:12:27
【问题描述】:

我使用了 kd-tree 算法并制作了树。

但是我发现树不平衡所以我的问题是如果我们使用 kd-tree 算法那么那棵树总是平衡的,如果不是那么我们怎样才能使它平衡?

我们可以使用 AVL 或 Red-Black 等其他算法来平衡 kd 树吗?

我有一些示例数据,我使用了 kd-tree 算法,但该树不平衡。

 (14,31), (15,32), (17,42), (16,44), (18,52), (16,62)

【问题讨论】:

  • 也许这会有所帮助:en.wikipedia.org/wiki/K-D-B-tree。不,您提到的技术不适用于平衡 KD 树。
  • 感谢 john ....K-D-B-tree 可以用于存储地理空间数据吗?
  • 在构建 kd-tree 之前,您是否有一组您完全知道的点?还是必须一直用新点更新 kd-tree?
  • 如果您的六个样本点被命名为 P1,P2,...,P6 那么这里是一个可以通过算法生成的平衡树:(P4,(P1,P2,nil),(P5, P3,P6))。你发现了什么问题?
  • 积分是随机的。没有固定的积分。点可以是任何经纬度对。它来自请求。

标签: algorithm data-structures avl-tree red-black-tree kdtree


【解决方案1】:

这是一个相当广泛的话题,问题本身也很笼统。 希望这将为您提供一些有用的见解和材料:

  • Kd 树并不总是平衡的。
  • AVL 和 Red-Black 不适用于 K-D 树,您需要构建一些平衡的变体,例如 K-D-B-tree,或者使用其他平衡技术。
  • K-d 树通常用于存储地理空间数据,因为它们可以让您搜索多个键,而“传统”树可以让您进行单维搜索。地理空间数据当然不能以单一维度表示。

请注意,还有专门的数据库处理地理空间数据,因此可能值得检查是否可以将开销转移给它们而不是自己制定解决方案:虽然我对此没有太多经验,但也许值得检查 postgis。

postgis

以下是一些有用的链接,展示了如何使用空间数据构建平衡的 K-D 树变体以及 K-D 树的使用:

balancing K-D-Tree

K-D-B-tree

spatial data k-d-trees

【讨论】:

  • 嘿,约翰,正如您所说,kd trree 用于存储地理空间数据对吗?但是如果我的第一个数据是这样的 (1, -1).. 现在该点之后的任何点都将插入在树的右侧,所以它不是真的。
  • 是的,在这种情况下是正确的,我想这没有多大意义。但是,如果您使用的是地理空间数据,您不会使用 3 维吗?
  • 我要存储经纬度
  • Root 应该是搜索空间的中位数。
  • 如果我使用 kd-tree 那么如何将 root 作为中值?因为第一个点很小,而其他点很大,那么在这种情况下,根不是平均数。
【解决方案2】:

这取决于你如何构建树。

如果按照最初发布的方式构建,树将是平衡的,即仅在叶级别它最多有 1 的高度差。如果您的数据集有 2^n-1 个元素,树将是完美平衡的.

当使用中值构造时,一半的对象必须在树的任一分支上,因此它具有最小的高度并且是平衡的。

然而,这棵树不能改变。我不知道会保留此属性的插入或删除算法,但 YMMV。我敢打赌,有两打 kd-tree 扩展旨在重新平衡并使插入/删除更有效。

k-d-tree 不是为变化而设计的,很快就会失去效率。它依赖于中值,因此对树的任何更改都会在最坏的情况下传播到整个树。因此,您需要在树质量中允许一些容差以支持更改。跟踪插入/删除并最终重建树似乎是一种常见的方法。不能将它与红黑树或 AVL 树结合,因为超过 1 维的数据没有排序;这些树仅适用于 有序 数据。树旋转时,分裂轴发生变化;并且可能有任何一半的元素突然需要移动到另一个分支。这不会发生在 AVL 或红黑树中。

但正如您可以想象的那样,人们已经发布了几个保持平衡的索引。比如k-d-b-trees和R-trees。这些对于需要存储在磁盘上的大数据也更有效。

【讨论】:

  • 谢谢 Anony..但我不知道为什么我必须使用 kd-b 和 R 树,因为我的目标是在节点中存储纬度和经度。 node就像c结构,包含四个字段(纬度,经度,右指针和左指针)。
  • Kd-tree 用于欧几里得距离,但对于纬度/经度,您将需要半正弦距离......同样在 r-tree 中,叶页只是纬度、经度对的列表,带有更少的指针。
  • 而且它们允许更新比 k-d-tree 好得多。
  • 是的,我使用过半正弦距离...你能给出如何使用 r-tree 而不是 kd-tree 并找到 r -tree 的最近点吗?
  • 有一个关于 R*-tree 的出版物,在某处有半正弦波,试试谷歌。据我所知,k-d-tree 不支持欧几里得以外的距离。
【解决方案3】:

为了让你的kd-tree平衡使用中值。
(14,31), (15,32), (17,42), (16,44), (18,52), (16,62)
在根中选择 x 坐标的中位数[14,15,16,16,17,18] 即 16,
所以所有小于 16 的元素都放在树的左侧
大于或等于的元素都放在树的右侧
截至目前,
左侧部分树由 [14,31],[15,32] 组成,现在为 y 轴找到 [31,32] 的中位数 使树平衡

【讨论】:

    猜你喜欢
    • 2013-06-05
    • 1970-01-01
    • 2012-06-20
    • 2014-01-27
    • 2011-03-22
    • 2011-04-03
    • 2013-12-29
    • 2021-10-10
    • 2012-12-15
    相关资源
    最近更新 更多