【发布时间】:2015-07-12 00:08:31
【问题描述】:
对于最近邻搜索等空间查询,理论上,KD 树或 Voronoi 或 R 树(或其变体之一)可以工作。但是动态数据的首选数据结构/算法是什么?
【问题讨论】:
标签: data-structures kdtree voronoi spatial-query r-tree
对于最近邻搜索等空间查询,理论上,KD 树或 Voronoi 或 R 树(或其变体之一)可以工作。但是动态数据的首选数据结构/算法是什么?
【问题讨论】:
标签: data-structures kdtree voronoi spatial-query r-tree
这取决于您的实际更新率。如果 1% 的数据每小时更改一次,或者 90% 的数据每跳一次更改(这在计算机游戏中很常见),则会有很大的不同。
kd-trees 对更新不是很健壮 - 您可以以可接受的成本插入,但删除通常使用墓碑处理,并且您需要经常重建树。它们存储在磁盘上的效率不是很高。对于电脑游戏,每次更新都重建一个 kd-tree 可能是可行的,而不是进行任何更新。
四叉树和其他基于网格的结构应该没问题,特别是如果您知道您的数据不能无限集中(例如,因为您之前确保了最小距离)。
R-trees 是一个很好的平衡点,特别是如果你想持久化你的数据。此结构 专为更新而设计,并试图将更改保持在本地。只有当页面溢出或下溢时才需要拆分。还存在保留更改列表的改进,因此它们可以进一步延迟对树的更新;这对提高吞吐量很有趣。
【讨论】:
您可以计算边界并简单地使用链表或数组/循环。它的运行速度也非常快,运行速度较慢,但构建成本更低。
【讨论】: