【问题标题】:Efficient data structure for representing a 2D grid用于表示 2D 网格的高效数据结构
【发布时间】:2015-02-22 21:21:10
【问题描述】:

有一个任意大小的二维网格。 (例如 1000*1000)

这是模式:

给定的输入是四个整数:x y w h,代表每个矩形左下角的 (x,y) 坐标及其宽度和高度。

具有共享边或重叠的矩形被定义为连通

一组相连的矩形被定义为一个

每个单元格上的矩形数量定义为其厚度

所以问题要求计算: 1、最大厚度 2.簇数 3.单个簇的最大簇元素数 4.单个集群的最大面积

例如上图中,最大厚度为3,有2个簇。一个簇由3个矩形组成,面积为44。另一簇元素个数为4,面积为30。因此簇元素个数最多的簇为4个,簇面积最大为44。


我的解决方案非常幼稚。我使用了一个 2-d int 数组来表示网格。读取输入时,我只是增加相应单元格中的数字。读取所有输入后,我使用深度优先搜索来确定聚类。

问题是我的算法非常慢,当输入大时(例如,当网格大小超过 1000*1000 时)很快就会变得不可用

所以我想知道有没有什么有效的数据结构和算法可以用来解决这个问题?

【问题讨论】:

  • 可以有多少个矩形?
  • 可能有很多。没有任何限制。
  • 相对于矩形的数量和网格的大小,所需的时间复杂度是多少?如果没有任何性能要求,就无法判断算法是否可行。
  • 列举的四个问题是集合问题。您试图想出一个好的“二维数据结构”(这将允许诸如“该点位于哪个矩形中”之类的查询)。查看解决二维问题的策略,例如线扫描分而治之。 (哦,好吧,我可能首先阅读了 IVlads 的答案。)

标签: algorithm data-structures


【解决方案1】:

我认为您刚刚描述了使用 2D AABB 结构的空间分区。

输入网格被扔进树中并任意定向。树的目的是排序。

您可能需要扩展树的功能以满足您的需求(例如连接、跟踪集群、层/厚度)。

用于包含 2D AABB 的空间分区树可以加宽、展开或叶缓存,以有效减少访问时间。

视频游戏中的 2D 物理引擎使用它来有效地管理成百上千个任意形状的物体碰撞,在任意大(大致无限)的网格尺寸上很容易。它们的处理可以通过 OpenCL(用于 CPU 和 GPU)或其他 GPGPU 技术等技术加速。

请参阅AABBs 上的这篇维基百科文章。

请参阅BSPs 上的这篇维基百科文章,了解使用(二叉)树进行空间分区的一般概念。

请参阅quadtrees 上的这篇 wikipedia 文章,它是一个可能更容易实现的高阶树概念,如果一切都是 AABB,可能会更快,因为它的宽度是 4 倍。您还可以展平更高阶的树,尽管好处似乎在二维空间的四叉树中最大。

请参阅collision detection 上的这篇维基百科文章,作为确定连接和集群的一种方式。

请参阅splay trees 上的这篇维基百科文章,了解张开和扩大树木的好处。

【讨论】:

    【解决方案2】:

    在读取所有输入后,我使用深度优先搜索来确定聚类。

    您不需要这样做 - 您可以在读取输入时决定集群,就像决定厚度一样。

    对于每个单元,跟踪它属于哪个集群。在迭代与读取矩形相对应的网格单元格时,请跟踪它们所属的集群。将您在此遍历期间找到的所有集群合并到一个集群中。使用Disjoint-set 数据结构,您可以在非常接近恒定的时间内有效地完成此操作。

    但是,sweep line algorithm 可能会更好地解决您的整个问题。

    【讨论】:

      【解决方案3】:

      我的建议是结合目前给出的另外两个答案:使用一些空间数据结构,比如AABB树或者四叉树来存储你目前处理过的所有矩形,这样你就可以快速找到连接的矩形;然后将连接的集群存储在联合查找或不相交集数据结构中。

      处理完所有矩形后,您就可以在线性时间内回答问题 2 和 3。问题 1(最大厚度)有点棘手;如果您不小心,如果所有矩形都重叠,您最终可能会进行二次重叠测试。答案 4 也是如此。

      因此,当您在空间数据结构中输入一个重叠的矩形时,最好的解决方案可能是将其拆分为厚度不变的不相交部分。那么1和4也比较容易回答比较快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-28
        • 1970-01-01
        • 2011-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多