寻找最少矩形来覆盖一组矩形而不重叠的算法

2024-02-20

我有一组矩形,我想“减少”该组,以便用最少数量的矩形来描述与原始组相同的区域。如果可能的话,我希望它也能很快,但我更关心的是让矩形的数量尽可能少。我现在有一个在大多数情况下都有效的方法。

Currently, I start at the top-left most rectangle and see if I can expand it out right and down while keeping it a rectangle. I do that until it can't expand anymore, remove and split all intersecting rectangles, and add the expanded rectangle back in the list. Then I start the process again with the next top-left most rectangle, and so on. But in some cases, it doesn't work. For example: enter image description here

With this set of three rectangles, the correct solution would end up with two rectangles, like this: enter image description here

然而,在这种情况下,我的算法首先处理蓝色矩形。这会向下扩展并分割黄色矩形(正确)。但是,当黄色矩形的剩余部分被处理时,它不是向下扩展,而是首先向右扩展并收回之前被分割掉的部分。然后处理最后一个矩形,它不能向右或向下扩展,所以留下了原始的一组矩形。我可以调整算法,先向下扩展,然后向右扩展。这可以解决这个问题,但在类似的翻转场景中会导致同样的问题。

Edit:只是为了澄清,原始的矩形集不重叠,也不必连接。如果连接了矩形的子集,则完全覆盖它们的多边形可以在其中有孔。


尽管你的问题有标题,但我认为你实际上是在寻找最低限度解剖成直线多边形的矩形。 (杰森的链接大约是最少的covers由矩形组成,这是一个完全不同的问题。)

大卫·爱普斯坦 http://www.ics.uci.edu/~eppstein/在他 2010 年调查文章的第 3 节中讨论了这个问题计算几何问题的图论解决方案 http://arxiv.org/pdf/0908.3916v1,他在中给出了很好的总结mathoverflow.net 上的这个答案 https://mathoverflow.net/questions/28303/split-polygon-into-minimum-amount-of-rectangles-and-triangles/28350#28350:

这个想法是找到以两个凹顶点作为端点的不相交轴平行对角线的最大数量,沿着这些顶点分割,然后为每个剩余的凹顶点再形成一个分割。找出不相交的平行轴对角线的最大数量,形成对角线的交图;该图是二分图,因此可以通过图匹配技术在多项式时间内找到其最大独立集。

这是我对这个令人钦佩的简洁描述的注释,使用了 Eppstein 文章中的图 2。假设我们有一个直线多边形,可能有孔。

当多边形被分割成矩形时,每个凹顶点必须至少与分割的一条边相交。所以我们得到minimum如果尽可能多的这些边具有双重功能,即它们连接两个凹顶点,则可以进行解剖。

因此,让我们在完全包含在多边形内的两个凹顶点之间绘制与轴平行的对角线。 (“轴平行”在这里是指“水平或垂直”,并且多边形的对角线 http://en.wikipedia.org/wiki/Diagonal#Polygons是连接两个不相邻顶点的线。)我们希望在解剖中使用尽可能多的这些线,只要它们不相交。

(如果没有与轴平行的对角线,则解剖很简单 - 只需从每个凹顶点进行切割即可。或者,如果与轴平行的对角线之间没有交点,那么我们将全部使用它们,再加上从每个剩余的凹顶点进行切割.否则,请继续阅读。)

The 交集图 http://en.wikipedia.org/wiki/Intersection_graph一组线段的每个线段都有一个节点,如果线相交,则一条边连接两个节点。这是与轴平行的对角线的交集图:

It’s 两部分 http://en.wikipedia.org/wiki/Bipartite_graph一个部分为垂直对角线,另一部分为水平对角线。现在,我们要选择尽可能多的对角线,只要它们不相交。这对应于找到最大独立集 http://en.wikipedia.org/wiki/Independent_set_%28graph_theory%29在交集图中。

在一般图中找到最大独立集是一个 NP 难题,但在二分图的特殊情况下,柯尼希定理 http://en.wikipedia.org/wiki/K%C3%B6nig%27s_theorem_%28graph_theory%29表明它等价于寻找最大匹配的问题,可以在多项式时间内解决,例如通过Hopcroft-Karp 算法 http://en.wikipedia.org/wiki/Hopcroft%E2%80%93Karp_algorithm。给定的图可以有多个最大匹配,但其中任何一个都可以,因为它们都具有相同的大小。在示例中,所有最大匹配都具有三对顶点,例如 {(2, 4), (6, 3), (7, 8)}:

(此图中的其他最大匹配包括 {(1, 3), (2, 5), (7, 8)}; {(2, 4), (3, 6), (5, 7)}; 和 { (1, 3), (2, 4), (7, 8)}。)

从最大匹配得到对应的最小顶点覆盖 http://en.wikipedia.org/wiki/Vertex_cover,应用柯尼希定理的证明 https://en.wikipedia.org/wiki/K%C5%91nig%27s_theorem_(graph_theory)#Proof。在上面显示的匹配中,左边的集合是L= {1, 2, 6, 7},正确的集合是R= {3, 4, 5, 8},以及不匹配顶点的集合L is U= {1}。只有一条替代路径从U,即 1–3–6,因此交替路径中的顶点集合为Z= {1, 3, 6} 最小顶点覆盖为K = (L \ Z) ∪ (R ∩ Z) = {2, 3, 7},如下图红色所示,最大独立集为绿色:

将其转化回解剖问题,这意味着我们可以在解剖中使用五个轴平行的对角线:

最后,从每个剩余的凹顶点进行切割以完成解剖:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

寻找最少矩形来覆盖一组矩形而不重叠的算法 的相关文章

  • 使用C标准数学库精确计算标准正态分布的CDF

    标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d
  • 通过分布式数据库聚合作业优化网络带宽

    我有一个分布式 联合数据库 结构如下 数据库分布在三个地理位置 节点 每个节点集群有多个数据库 关系数据库是 PostgreSQL MySQL Oracle 和 MS SQL Server 的混合体 非关系数据库是 MongoDB 或 Ca
  • Codility 钉板

    尝试了解 Codility NailingPlanks 的解决方案 问题链接 https app codility com programmers lessons 14 binary search algorithm nailing pla
  • 检索受“rowspan”影响的行的列索引的最有效方法是什么?

    考虑下表 table thead tr th th th A th th B th th C th tr thead tbody tr th 1 th td Apples td td Oranges td td Pears td tr tb
  • 删除队列中的最后一个元素

    我需要删除队列的最后一个元素 我唯一可以使用的操作是 Peek 获取第一个元素而不删除它 Enqueue element 向队列末尾插入一个元素 Dequeue 删除第一个元素 IsEmpty true 或 false 队列是否为空 而且我
  • 高维最近邻搜索的最佳数据结构

    我实际上正在处理高维数据 50 000 100 000 个特征 并且必须对其执行最近邻搜索 我知道随着维度的增长 KD 树的性能很差 而且我还了解到 一般来说 所有空间分区数据结构都倾向于对高维数据执行详尽的搜索 此外 还有两个重要事实需要
  • 固定大小集以包含给定集的最大数量

    我有大约 1000 组尺寸 1 4 1 3 3 5 6 4 5 6 7 5 25 42 67 100 是否有可能找到包含最大数量的给定集合的大小为 20 的集合 检查每一个100 80 20 集 效率低下 我不太确定这是 NP 完全的 考虑
  • 黑色左/右三角形大小不同

    我使用黑色左指三角形 右左指三角形几何形状作为网站上的链接 并使用它们的 HTML 代码 和 9664 9654 由于某种原因 即使我在没有其他元素的空白页面上使用三角形 它们也不会以相同的大小显示 在 Chrome 上 向左指向的位置比向
  • 如何求小于给定数的最大2次方

    我需要找到小于给定数字的最大 2 次幂 我陷入困境 找不到任何解决方案 Code public class MathPow public int largestPowerOf2 int n int res 2 while res lt n
  • 类是否应该有静态和非静态成员

    我试图找出一个类何时适合同时具有静态和非静态函数 又名 obj new ClassA obj gt doOOPStuff something ClassA doStaticStuff Note This example is done in
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 关于在字典中查找所有有效单词的算法问题

    给定一个字典 只是一个字符串列表 您收到来自外部来源的未知数量的信件 给定字母串 您将如何列出您可以通过这些字母的任意组合组成的所有有效单词 来自字典 因此 如果您收到 applead 你应该找到apple bad pad lead等 我知
  • C 埃及分数

    古埃及人仅使用以下形式的分数1 n因此任何其他分数都必须表示为这些单位分数的总和 而且 所有单位分数都是不同的 在C或Java中使任何分数成为埃及分数 总和越少越好 的好方法是什么 可以使用什么算法 分支定界 a 例如 3 4 1 2 1
  • 带路径压缩算法的加权 Quick-Union

    有一种 带路径压缩的加权快速联合 算法 代码 public class WeightedQU private int id private int iz public WeightedQU int N id new int N iz new
  • 用 C++ 生成 AST

    我正在用 C 制作一个解释器 到目前为止我已经有了词法分析器来生成标记 问题是我不确定如何生成 行走 解析树 我正在考虑使用数组数组来制作解析树 但我不确定如何以正确的顺序将标记实际插入到解析树中 我不确定是自上而下 左右还是自下而上 左右
  • 有没有办法在 JTS 中将自相交多边形转换为多重多边形?

    取无效多边形POLYGON 0 100 100 100 0 0 100 0 0 100 一个带有未声明交点的煮蛋定时器形状 许多说明说 JTS 可以使用以下命令创建此版本的有效版本 buffer method Geometry input
  • 如何检查是否存在可能的路径?

    我正在开发一个基于 javascript 的实验性游戏 玩家必须在二维平铺地图上移动才能退出 请随意检查这个小提琴并演奏 http jsfiddle net moonlife 74vLd 我只是随机放置障碍物 但有时障碍物会挡住玩家和出口之
  • shell脚本中关联数组的时间复杂度

    我想知道在 shell 脚本中使用关联数组时如何构造 实现 另外 我想知道基于 shell 脚本的关联数组的时间复杂度是否是最佳的 因为我们可以使用字母和数字作为它们各自的键 编辑 他们使用什么哈希函数 如果您使用关联数组 则不能通过 使用
  • Florian 的 Grisu2 算法如何工作?

    我遇到了一个关于将 double 转换为 ascii 的问题 经过搜索 我得到了 Florian 的论文 使用整数快速准确地打印浮点数 http www cs tufts edu nr cs257 archive florian loits
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它

随机推荐

  • CSS,如何使水平菜单和子菜单居中?

    我正在学习 css 但我不知道菜单和子菜单居中 我正在使用 margin auto 或 margin left 和 margin right 为 auto 但它不起作用 任何帮助 将不胜感激 谢谢 HTML div ul li a href
  • 如何在JavaScript中不使用输入类型文件读取包含html的文本文件?

    我有一个文本文件assets包含一些要在特定组件的 div 中呈现的 html 的文件夹 有没有一种方法可以读取该文件并将内容分配给字符串变量 而无需用户与 ngOnInit 中的视图 具有输入文件类型 进行交互 我的发现如果我将 html
  • 如何覆盖 CSS

    我有基本的 CSS 经验 所以我想知道如何删除由 Primefaces 设置的 CSS 样式 ui inputfield ui widget content ui inputfield ui widget header ui inputfi
  • Hadoop:映射器和缩减器的数量

    我使用不同数量的映射器和缩减器 例如 1 个映射器和 1 个缩减器 1 个映射器和 2 个缩减器 1 个映射器和 4 个缩减器 在 1 1GB 文件上多次运行 Hadoop MapReduce Hadoop安装在具有超线程的四核机器上 以下
  • JS:未捕获类型错误:对象不是函数(onclick)

    Edit 这是一个 JSfiddle http jsfiddle net XpmZG Edit2 错误在这一行
  • 如何获取物理设备支持的音频格式(WinAPI、Windows)

    我有一个音频设备 USB 麦克风 我想找出它本机支持的音频格式 位深度和采样率 在 OS X 上有一个很好的 kAudioStreamPropertyAvailablePhysicalFormats Core Audio 属性 但我找不到类
  • 使用文件名中的当前日期创建文件 + Robocopy 日志记录

    由于对批处理文件 脚本和一般 编码 的经验很少 我很快就遇到了我想要创建的批处理的问题 情况如下 我有一个文件夹 其中自动插入 txt 文件 我想根据文件的名称将这些文件移动到不同的文件夹 我用 Robocopy 做了这个 效果很好 然后我
  • 如何为 AlertDialog 创建 setAdapter()

    我创建了一个CustomDialogBuilder延伸Dialog 我想创建方法setApater 我创建了该部分 但是onClick适配器上的方法不起作用 My customDialogBuilder下面给出了类 public class
  • 为什么带有转换器的多重绑定在工具提示中不起作用?

    对于相当复杂的 WPF 工具提示的一部分 我尝试使用 MultiBinding 来生成基于两个属性的格式化文本 问题是 绑定的 MultiConverter 接收DependencyProperty UnsetValue对于其中的每个项目v
  • matplotlib matshow xtick 顶部和底部标签

    我正在尝试可视化名称共现矩阵 这个版本工作正常 import pandas as pd import numpy as np import string import matplotlib pyplot as plt n 10 names
  • 在 GitHub 上以协作者身份编辑文件

    我正在尝试对我被邀请作为合作者的 GitHub 存储库进行更改 我可以创建新文件并修改它们 但是当我尝试对现有文件进行任何更改时 我看到这条消息说 您必须在分支上才能对该文件进行或建议更改 然后 只有在通过终端推送提交后 我才能在 GitH
  • FEATURE_ACTIVITY_TRANSITIONS 与 FEATURE_CONTENT_TRANSITIONS

    我无法理解这两者之间的区别Window http developer android com reference android view Window html标志 但我不能 100 确定何时需要使用每一个以及为什么 的文档Window
  • 为什么 Flutter 小部件是不可变的?

    我无法理解为什么 Flutter 对象是不可变的 我在 Flutter 文档中尝试过 但没有那么有帮助 如果有人能帮助我解决这个问题 我将不胜感激 另外 我两天前才开始使用 flutter 非常棒 From https api flutte
  • 如何使用python捕获网络流量[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在使用 python 并尝试抓取我的计算机和站点之间的 HTTP s 流量 其中包括所有传入和传出请求 响应 例如图像和外部调用等
  • @ngrx/store 是可观察到的热还是冷?

    我认为它是一个冷可观察的对象 默认情况下 但在代码或文档中找不到对它的引用 抱歉 如果已经问过这个问题 找不到东西 TLDR这是一个热门的观察点 因为动作主题 https github com ngrx platform blob mast
  • 如何在 vscode 中根据自定义的 launch.json 创建模板?

    对于我的项目 我定制了我的启动 json file 如何将自己的自定义启动配置保存为模板 就像C GDB LLDB 模板 这样我每次打开新文件夹 项目 时都可以轻松地重新使用它 我不想将其添加到下面全局启动配置 https code vis
  • 如何订购淘汰赛绑定?

    我正在使用 Knockout js 我陷入了一个有点奇怪的情况 很难解释 但我正在尝试 如果我不清楚 抱歉 我在单个选择列表上使用自定义绑定和选项绑定
  • 什么是缓冲区?什么是缓冲读和缓冲写?

    今天很长一段时间后我听到了 缓冲区 这个词 想知道是否有人可以很好地概述缓冲区以及它在当今世界的重要性的一些例子 缓冲区通常是内存的一部分 其中包含尚未完全提交到其预期设备的数据 在缓冲 I O 的情况下 通常有一个快速设备和一个慢速设备
  • 尝试使用 KMS 解密 Lambda 函数中的密文会导致超时

    使用 AWS CLI 从命令行解密密文时 密文可以顺利解密 aws kms decrypt ciphertext blob fileb encrypted secrets output text query Plaintext region
  • 寻找最少矩形来覆盖一组矩形而不重叠的算法

    我有一组矩形 我想 减少 该组 以便用最少数量的矩形来描述与原始组相同的区域 如果可能的话 我希望它也能很快 但我更关心的是让矩形的数量尽可能少 我现在有一个在大多数情况下都有效的方法 Currently I start at the to