【问题标题】:Data structure for spatial data空间数据的数据结构
【发布时间】:2011-06-15 09:57:52
【问题描述】:

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

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

【问题讨论】:

  • 澄清一下:epsilon 查询是否是一个查询,以查找在给定点指定距离内的点?

标签: data-structures ocaml functional-programming


【解决方案1】:

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

(顺便说一句,我觉得你的两个建议已经很不错了)

【讨论】:

    【解决方案2】:

    This old paper Overmars 和 van Leeuwen 描述了 伪四叉树 - 四叉树还可以随着插入和删除的进行而平衡自身。插入和删除的摊销成本类似于O(log^d(n)),甚至可以与完成的平衡量进行交易(您可以在论文中阅读更多相关信息)。

    【讨论】:

      【解决方案3】:

      KD-trees 或 Quad/Oct tree 是合理的选择。

      Haskell 中的示例:

      两者都非常容易编码为纯函数数据结构。

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • 看起来相当不错,虽然我必须修复一些东西才能让它在这里工作。感谢您的帮助...
        猜你喜欢
        • 2015-07-12
        • 2022-01-01
        • 2014-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-24
        • 2010-10-30
        • 1970-01-01
        相关资源
        最近更新 更多