【发布时间】: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 的答案。)