1
6
这里有一个分而治之的算法。一般情况下,案件的复杂程度是非常好的,我想说这是类似的
我想不出一个扫描线的解决方案,但对于我尝试过的测试来说,这是非常快的。
基本上,在蓝色矩形上使用递归函数。首先检查蓝色矩形是否被其他矩形完全覆盖。如果是,我们就完了。如果不是,则将其分成4个象限,并递归调用这些象限上的函数。所有4个递归调用都必须返回true。我包括一些绘制矩形的C代码。您也可以将其更改为使用更大的值,但在这种情况下请删除绘图过程,因为这些过程将永远需要。我已经用一百万个矩形和一个10亿边的正方形来测试它,这样它就不会被覆盖,并且给出了答案(
我已经在随机数据上测试过了,但似乎是正确的。如果结果不是这样,我就删除这个,但也许它会让你走上正确的道路。
|
2
1
你在正确的轨道上扫线。从概念上讲,我们希望检测模型与扫描线的交点何时不被其他矩形覆盖。高级模板是将每个矩形分解为一个“左边缘”和一个“右边缘”事件,按x坐标对事件进行排序(如果矩形闭合,则将左置于右之前,如果矩形打开,则将右置于左之前),然后在O(logn)时间内处理每个事件。这基本上是家庭作业,所以我不会再说了。 |
3
1
这里有一个通用算法
现在的问题是如何有效地做到这一点。上面的步骤可以在所有多边形上的一个循环中完成,所以我认为您看到的是O(n)时间。 如果您需要创建有效的算法来测试多个模型,或者如果您必须优化以获得尽可能快的答案(以准备数据为代价),那么您正在寻找一种结构,该结构允许快速回答矩形与矩形相交(或包含)的问题。 例如,如果你使用 kd-trees 我的猜想是,这个并集可以用O(k logk)来计算,所以如果k很小,那么你看的是O(logn),如果k与n相当,那么它应该是O(k logk)。 另请参见 this 问题。 编辑: 更详细地说,根据k<<n或k与n相当,我们有两种情况
总数是O(k+logn+f(k)),它直接等于O(logn),因为大O只依赖于增长最快的项。 在这种情况下,算法更重要的部分是找到多边形。
b) 在k与n相当的情况下,我们必须研究交并算法的复杂性
但是,我相信kd树也有助于找到线段的交集(这是构建并集所必需的),所以即使是算法的这一部分也可能不需要k^2时间。 此时,我将研究计算并集面积的有效算法。 |
4
1
有一个小问题
|
5
1
好吧,现在看来我晚上都睡不着,因为我想到这个问题。。。但似乎我终于得到了一个
O(n对数n)
溶液,in
平均的
病例(但与对照组相比,出现病理输入的几率降低)
我们都知道
技术。确保
考虑到这些约束,我详细阐述了下面的算法,这让人想起
算法
这个
数据透视选择
是算法的基石,如果分区裁剪不当,则无法达到所需的复杂度。此外,它必须在
我提议把它们混在一起:
实施的另一个方面是
尾巴
关于递归。就像
维度不可知 该算法被形式化地定义为适用于任意给定维,具有相同的渐近复杂度 平均O(n log n) 病理输入
就像
每当你选择你的时间间隔的平均值时,所有的元素都在它的一边。 有了这样的投入,即使选择中位数3也不太可能产生非常好的削减。 编辑:
我将用一个小方案来展示分区的思想,如下所示
好的,我们检查覆盖范围的矩形现在被分成9个子矩形。我们忽略P,它是我们的轴心。
现在,我们真的希望每个子矩形被较少的
我很高兴如果有人能把这一点正规化,我是一个工程师,而不是一个计算机科学家,我的数学落后于。。。 |
6
1
我一直在想,我想我终于明白了
扫描线
首先,我们需要一些分类,因为我们的
此有序集将具有
现在,我们需要确保
为了处理这个事件,我们将使用下面描述的二叉树来处理添加或删除一个矩形
二叉树
首先,我要索引
然后我将创建一个专用的二叉树。
处理“代码块不能跟随列表”错误:
现在我们有两种可能,假设孩子们
特殊节点忽略
根可能不表示覆盖的确切间隔集:只显示覆盖的最右边的间隔。但是,我们完全可以判断
此树上有两个可用操作:
递归位需要
复杂性
这就产生了
每个人都应
|
8
0
如果数据表示为光栅,则一种算法很简单:
如果数据是矢量的,就有点复杂了。首先定义一个函数,返回表示两个矩形相交(如果有的话)的矩形。这很简单。然后继续:
好吧,我还不知道这个算法的复杂性,但是除非矩形的数目很大,否则我不会太担心,尽管@den可能是。我遗漏了很多细节。我不能像@den那样画漂亮的图表,所以你得自己画出来。 |
9
0
注意 :这不是O(n logn),更像O(n^2)。然而,这是一个解决办法。如果O(n logn)是一个要求,则可能不是答案。
因此,输出应为:
让我来说明目前的进程
关联矩形:
X=1列表为空,无需处理 没有要删除的内容 加A:L=[A] X=2列表包含矩形,将列表处理为左边缘为X=1,右边缘为X=2的矩形(到目前为止我们处理的两个坐标),并使用它们的原始顶部和底部坐标。 没有要删除的内容。 加上B:L=[A,B] X=3列表包含矩形,以相同的方式处理列表(A和B),将其视为临时具有X=2和X=3的左右坐标,并使用其原始的顶部和底部坐标。 没有要删除的内容 加上C:L=[A,B,C] 按上述方法处理三个矩形,临时左右坐标为X=3和X=4 删除B:L=[A,C] 没什么要补充的 X=5和X=6以完全相同的方式处理这些。 这意味着您将以矩形的“条带”结束,如下图所示(我将它们分开一点以更清楚地说明它们是条带,但它们是并排连续放置的,如原始图中所示):
好了,现在你有了你的输出,一组坐标对,每一对都有一个相关的矩形列表。
长条看起来像这样:
矩形坐标列表:
新空列表L=[] 处理坐标: 无需处理(L=[]) 添加到列表,L=[A] Y=2进程A的顶部和底部坐标暂时为Y=1和2(记住,它的左侧和右侧坐标暂时为X=3和4) 加上C,L=[A,C] 过程A和C,现在都有临时坐标(3,2)-(4,3) 加上B,L=[A,B,C] Y=4过程A、B和C,坐标均为(3,3)-(4,4) Y=5过程A和B,坐标(3,4)-(4,5) 删除A,L=[B] Y=6过程B,坐标(3,5)-(4,6) 最终输出: Y坐标对,以及与其关联的矩形(也临时获得了新的X坐标):
现在,假设你想问这样一个问题:B是否完全被其他矩形的所有组合所覆盖。 答案如下:
在上面的示例中,我们看到最终列表中的第3和第4个矩形包含B,但也包含其他矩形,因此覆盖了B的这些部分,但是列表中的最终矩形也包含B,但没有其他矩形,因此不覆盖此部分。
如果我们现在重新看一下原始的图表,我已经将上面的算法发现的包含B的部分阴影掉了,但是没有其他矩形:
我真的希望我在这里能让别人明白我的意思。我有一些代码可以帮助你实现坐标列表中的每一次运行,但是现在已经过了午夜01:21,我要睡觉了,但是如果你想看到一些实际的代码,请留下评论。 或者自己去实现它是一个很好的练习:) 下面是指向包含所讨论方法的类的链接: RangeExtensions.cs .
方法是
|
10
0
下面介绍如何使扫掠线在O(n lgn)中工作。我将重点介绍BST工作原理中的棘手部分。 保持平衡的BST,其中包含与当前扫描线相交的每个矩形的起点和终点。BST的每个节点都包含两个辅助字段:minOverlap和deltaOverlap。字段minOverlap通常存储与该节点的子树覆盖的间隔中的任何点重叠的最小矩形数。但是,对于某些节点,该值稍微偏离。我们保持一个不变量,即minOverlap加上每个节点到根的deltaOverlap之和,在节点的子树中有一个区域重叠的真正最小矩形数。 当我们插入一个矩形起始节点时,我们总是在一个叶子处插入(可能还会重新平衡)。当我们沿着插入路径遍历时,我们将任何非零的deltaOverlap值“下推”到插入节点的访问路径的子节点,更新访问路径上节点的minOverlap。然后,我们需要在O(lgn)时间内增加树中插入节点右侧的每个节点。这是通过增加插入节点的所有右祖先的minOverlap字段和增加插入节点的右祖先的所有右子代的deltaOverlap来实现的。执行类似的过程来插入结束矩形的节点,以及删除点。通过仅修改旋转中涉及的节点的字段,可以执行重新平衡操作。你所要做的就是检查扫描中每个点的根,看看minOverlap是否为0。 我省略了处理重复坐标之类的细节(一个简单的解决方案就是将打开的矩形节点排在同一坐标的任何关闭的矩形节点之前),但希望它能给您一个想法,并且相当有说服力。 |
11
0
你知道最坏的情况吗
如果这些面积相等,则模型完全被覆盖,否则就不是。 |
12
-2
下面是一个使用一些内存的O(nlgn)运行时方法。 使用以下示例:
1 2 3 4 5 6 1 +---+---+ | | 2 + A +---+---+ | | B | 3 + + +---+---+ | | | | | 4 +---+---+---+---+ + | | 5 + C + | | 6 +---+---+ 1) 收集所有的x坐标 在模型矩形的边界内 1 3 4 5 6 2) 收集所有y坐标 在模型矩形的边界内 (顶部和底部)放入一个列表,然后对其排序并删除重复项 1 2 3 4 6 3) 按唯一x坐标之间的间距数*唯一y坐标之间的间距数创建二维数组。这可以使用每个单元的一个比特,并且可以考虑使用C++的STL的BITYVECUTE()来进行高效的表示。 4 * 4 4) 将所有矩形绘制到该网格中,绘制其所在的单元格: 1 3 4 5 6 1 +---+ | 1 | 0 0 0 2 +---+---+---+ | 1 | 1 | 1 | 0 3 +---+---+---+---+ | 1 | 1 | 2 | 1 | 4 +---+---+---+---+ 0 0 | 1 | 1 | 6 +---+---+ 5) 如果任何细胞保持未上漆,你知道你的模型是不是完全闭塞(或任何你正在测试)。 采集坐标和绘制步骤为O(n),坐标的排序为O(n lg n)。 What is an Efficient algorithm to find Area of Overlapping Rectangles |
danial · 如何在多个字符串的每个位置找到最频繁的字符 2 年前 |
Manny · 如何比较Perl中的字符串? 2 年前 |
Diret · 获取范围内每个数字的子倍数的算法 2 年前 |
Saif · 排序时python如何决定何时调用比较器? 2 年前 |