Algorithm 表示二维网格的高效数据结构

Algorithm 表示二维网格的高效数据结构,algorithm,data-structures,Algorithm,Data Structures,存在任意大小的二维网格。e、 g.1000*1000 以下是模式: 给定的输入是四个整数:x y w h,表示每个矩形左下点的x,y坐标及其宽度和高度 具有共享边或重叠边的矩形定义为已连接 一组连接的矩形被定义为簇 每个单元上的矩形数定义为其厚度 因此,问题要求计算: 1.最大厚度 2.集群的数量 3.单个群集的最大群集元素数 4.单个群集的最大面积 例如,在上图中,最大厚度为3,有2个簇。一个簇由3个矩形组成,其面积为44。另一个簇中的元素数为4,面积为30。因此,具有最大簇元素数的簇为4,最

存在任意大小的二维网格。e、 g.1000*1000

以下是模式:

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

具有共享边或重叠边的矩形定义为已连接

一组连接的矩形被定义为簇

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

因此,问题要求计算: 1.最大厚度 2.集群的数量 3.单个群集的最大群集元素数 4.单个群集的最大面积

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

我的解决办法很幼稚。我使用了一个二维整数数组来表示网格。读取输入时,我只需增加相应单元格中的数字。读取所有输入后,我使用深度优先搜索来确定集群

问题是我的算法非常慢,当输入量很大时,很快就无法使用。当网格大小超过1000*1000时

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

读取所有输入后,我使用深度优先搜索来确定集群

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

对于每个单元,跟踪它所属的集群。当迭代与读取矩形对应的网格单元时,跟踪它们所属的集群。将在此遍历过程中找到的所有簇合并到单个簇中。您可以使用数据结构在非常接近恒定的时间内高效地完成这项工作


但是,您的整个问题可能会通过一个解决方案得到更好的解决。

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

输入网格被放入树中并任意定向。这棵树的作用是分类

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

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

视频游戏中的2D物理引擎使用此功能可以有效地管理数百到数千个任意形状的对象碰撞,并且可以轻松地在任意大的大致无限的网格大小上进行。它们的处理可以通过OpenCL for CPU和GPU或其他GPGPU技术来加速

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

有关使用二叉树进行空间分区的一般思想,请参阅上的这篇wikipedia文章

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

请参阅上的这篇wikipedia文章,作为确定连接和集群的一种方法


查看这篇维基百科文章,了解扩展和加宽树的好处。

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

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


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

可以有多少个矩形?可以有很多。对于矩形的数量和网格的大小,所需的时间复杂度是多少?如果没有任何性能要求,就无法判断算法是否可行。列举的四个问题是集合问题。您在尝试想出一个好的二维数据结构时遇到了困难,该结构允许查询这一点位于哪个矩形中。看看解决二维问题的策略,比如扫线或分治。哦,好吧,首先,我可能已经看完了IVlads的答案。