空间数据的数据结构

时间:2011-06-15 09:57:53

标签: data-structures ocaml functional-programming

我正在寻找一个良好的功能数据结构来存储空间(点)数据。数据结构应允许对已存在的点进行简单的epsilon查询。我还需要经常修改数据。这意味着点可以移动,并且应该能够在数据结构中更新。这可以使用普通的删除/添加来处理,但真正的移动可能会更快。

现在我正在考虑使用quad/oct-trees(或更高版本),因为移动部分应该很容易。然而,就平衡而言,已知四叉树更糟糕。 KD-Trees可能是另一种选择,但更新似乎非常讨厌。我能找到的大多数空间数据结构实现只是程序性的,我使用的是函数式语言。

4 个答案:

答案 0 :(得分:4)

根据您使用它的方式以及快速移动点数,您可能还会考虑sweep and prune。基本上,您将点保持在一个维度(例如x)中。如果点很少更改位置,则每个模拟步骤的运行插入排序实际上非常快。

(顺便说一句,我认为你的两条建议已经相当不错了)

答案 1 :(得分:4)

Overmars和van Leeuwen的

This old paper描述了伪四叉树 - 四叉树,它也可以在插入和删除过程中自我平衡。插入和删除的摊销成本类似于O(log^d(n)),甚至可以与完成的平衡量进行交易(您可以在本文中详细了解这一点)。

答案 2 :(得分:3)

KD树或Quad / Oct树是合理的选择。

Haskell中的示例:

将两者编码为纯粹的功能数据结构非常简单。

答案 3 :(得分:3)

R-Trees和R * -Trees也是另一种解决方案,易于实施。

请参阅https://github.com/mariusaeriksen/ocaml-rtree(在OCaml中)获取示例。

我在疏散模拟中使用它们,更新步骤并不是那么慢。