点覆盖问题

2024-01-27

我最近在测试中遇到了这个问题:给定一组点m(全部在 x 轴上)和一组n具有端点的线[l, r](再次在 x 轴上),找到 的最小子集n这样所有的点都被一条线覆盖。证明你的解决方案总是能找到最小子集。

我为它编写的算法的效果是: (假设线存储为数组,左端点位于位置 0,右端点位于位置 1)

algorithm coverPoints(set[] m, set[][] n):
    chosenLines = []
    while m is not empty:
        minX = min(m)
        bestLine = n[0]
        for i=1 to length of n:
            if n[i][0] <= minX and n[i][1] > bestLine[1] then
                bestLine = n[i]
        add bestLine to chosenLines
        for i=0 to length of m:
            if m[i] <= bestLine[1] then delete m[i] from m
    return chosenLines

我只是不确定这是否总能找到最小的解决方案。这是一个简单的贪婪算法,所以我的直觉告诉我它不会,但是我的一位朋友在这方面比我强得多,他说对于这个问题,像这样的贪婪算法总是能找到最小解决方案。为了证明我的总是能找到最小的解决方案,我通过矛盾做了一个非常手工的波浪式证明,其中我做出了一个可能根本不正确的假设。我完全忘记了我做了什么。

如果这不是一个最小的解决方案,有没有办法在不到 O(n!) 的时间内完成它?

Thanks


你的贪心算法IS正确的。 我们可以通过证明任何其他覆盖只能通过用您的算法生成的覆盖替换它来改进它来证明这一点。

令 C 为给定输入的有效覆盖(不一定是最佳输入),并令 S 为根据您的算法的覆盖。现在让我们检查点 p1、p2、... pk,它们代表您在每个迭代步骤中处理的最小点。覆盖层 C 也必须覆盖它们全部。观察到 C 中没有任何线段覆盖其中的两个点;否则,你的算法会选择这个片段!因此,|C|>=k。您的算法的成本(段数)是多少? |S|=k。

这样就完成了证明。

两个注意事项:

1)实现:用n[0]初始化bestLine是不正确的,因为循环可能无法改进它,并且n[0]不一定覆盖minX。

2)实际上这个问题是一个简化版本设置封面 http://en.wikipedia.org/wiki/Set_cover问题。虽然原始模型是 NP 完全的,但这种变化结果是多项式的。

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

点覆盖问题 的相关文章

  • 使用到达时间差对信号进行三边测量

    我在寻找或实现寻找信号源的算法时遇到一些麻烦 我的工作目标是找到声音发射器的位置 为了实现这一点 我使用了三个麦克风 我正在使用的技术是多点定位这是基于到达时间差 The 到达时间差使用发现每个麦克风之间互相关接收到的信号 我已经实现了算法
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • pytesseract 无法从图像中识别复杂的数学公式

    我在用pytesseractpython 中的模块 pytesseract从图像中识别文本 但它不适用于包含复杂数学公式 例如根 推导 积分数学问题或方程 的图像 代码2 py Import modules from PIL import
  • 通过排列四个给定数字找到最大可能时间 HH:MM

    我最近为了工作晋升而参加了编码测试 这是我真正遇到的任务之一 我想知道什么是最好的方法来做到这一点 我使用了大量的 if 和 if else 这不是最干净的解决方案 但完成了工作 我被问到的问题是 将 4 个数字格式化为 24 小时时间 0
  • 比 BMH (Boyer–Moore–Horspool) 更快的算法

    您会使用哪种算法来搜索短文本中的短子字符串 简而言之 我的意思是子字符串有 5 10 个字符 字符串有 255 个字符 我正在考虑根据输入数据长度选择算法 哪种算法对于较长的输入更好 Try Turbo BM http www igm un
  • 生成 2D 中的非简并点集 - C++

    我想在 2D 平面中创建一大组非退化的随机点云 整个集合中没有 3 个点在一条直线上 我有一个简单的解决方案 它生成一个随机浮点对 P new x y 并检查到目前为止生成的每对点 P1 P2 是否位于同一行 这需要 O n 2 检查添加到
  • 字符串的渐进单词组合

    我需要获得字符串的渐进单词组合 例如 这是字符串 输出 这是字符串 这是 这个字符串 是字符串 这 是 细绳 你知道类似的算法吗 我需要php语言 谢谢 这是解决您问题的简单代码 我将每个字符串递归地连接到数组中的其余字符串 string
  • 分组符号最大长度平衡子序列

    将 B 视为分组符号 和 的序列 如果 B 的长度为 0 或 B 具有以下形式之一 则称 B 为平衡序列 X Y 或 X Y 或 X Y 其中 X 和 Y 本身是平衡的 平衡示例 现在的问题是找到一种有效的算法来找到给定输入的最大长度平衡子
  • 为什么Python中pop()的大O与pop(0)不同[重复]

    这个问题在这里已经有答案了 他们不应该都是O 1 因为从 Python 列表中的任何位置弹出一个元素涉及销毁该列表并在新的内存位置创建一个元素 蟒蛇的list实现使用动态调整大小的 Carray在引擎盖下 删除元素usually要求您移动后
  • 为什么我们需要检测链表中的循环

    我看到很多关于如何检测链表中的循环的问答 但我想了解的是我们为什么要这样做 换句话说 检测链表中的循环的实际用例是什么 在现实生活中 您可能永远不需要检测链表中的循环 但是执行此操作的算法很重要 我在现实生活中多次使用它们 例如 我经常会递
  • java中的Anagram算法

    我想做字谜算法但是 这段代码不起作用 我的错在哪里 例如 des 和 sed 是字谜 但输出不是字谜 同时我必须使用字符串方法 不是数组 public static boolean isAnagram String s1 String s2
  • 埃拉托斯特尼筛法是生成 1 到 N 素数的最佳算法吗?

    我在一次采访中被问到这个问题 我使用埃拉托色尼筛子概念和数组实现了一种算法 有没有更好的方法来解决这个问题 对于不知道筛子的人 请点击以下链接 http en wikipedia org wiki Sieve of Eratosthenes
  • 如何在大空间尺度上加速A*算法?

    From http ccl northwestern edu netlogo models community Astardemo http ccl northwestern edu netlogo models community Ast
  • 大小为 n 的数组,其中一个元素 n/2 次

    给定一个由 n 个整数组成的数组 其中一个元素出现超过 n 2 次 我们需要在线性时间和恒定的额外空间中找到该元素 YAAQ 又一个数组问题 我有一种偷偷的怀疑 这类似于 在 C 中 We don t need an array publi
  • 让电脑实现360度=0度,旋转炮塔

    我正在制作一个游戏 其中有一个计算机控制的炮塔 炮塔可360度旋转 它使用 trig 找出枪瞄准所需的角度 obj deg 并将枪的当前角度存储在 gun deg 下面的代码以设定的速度旋转枪 if objdeg gt gundeg gun
  • Python 将字符串组合成尽可能短的字符串?

    如果我有一个字符串列表 我想将它们组合成一个具有重叠字符的字符串 如果没有剩余的重叠字符串 请将其添加到末尾 这是一个过于简化的版本 input one two output twone 我正在寻找一种方法来对输入列表中的任意数量的字符串执
  • 创建将 n 个用户放入 k 个组的所有可能方法

    给定 n 个用户 u 1 u 2 u n 和 k 个组 g 1 g 2 g k 创建所有组的所有可能组合 基本上 最后每个组合都是一个Map 其中第一个Integer是用户ID 第二个Integer是组ID 例如 u 1 g 1 u 2 g
  • Haar级联正例图像大小调整

    我正在迈出第一步 为自定义对象识别创建 haar 级联 我花了时间获取大量数据并编写了一些预处理脚本以将视频转换为帧 我的下一步是裁剪感兴趣的对象 以创建一些积极的训练示例 我有几个问题 我确实在网上寻找答案 我有点困惑 我读到我应该致力于
  • 找到将一个数字转换为另一个数字的最小移动次数的算法

    假设我们有两个正整数 a 和 b 每次移动我们都可以将 a 除以 2 但前提是 a 是偶数 将 a 乘以 2 或者将 a 加 1 将a变为b需要多少步 找到一个直接公式或一种有效的算法 即以对数时间运行的算法 我取得的一些进展 我们可以把它
  • 模式识别算法

    过去我必须开发一个充当规则评估器的程序 你有一个先行词和一些后续词 动作 所以如果先行词评估为真 则执行的动作 当时我用的是修改版RETE算法 http en wikipedia org wiki Rete algorithm RETE 有

随机推荐

  • 遍历多处理队列

    我有两个多处理线程 一个将项目添加到队列中 另一个需要迭代当前队列 我该如何进行迭代 或者 如何将当前队列转换为列表进行迭代 一些伪代码 import multiprocessing as mp thequeue mp Queue def
  • AngularJs:重新加载页面

    a class navbar brand title home PORTAL NAME a 我想重新加载页面 我怎样才能做到这一点 您可以使用reload的方法 route服务 注入 route在你的控制器中 然后创建一个方法reloadR
  • php imagepng() 仅在服务器上生成黑色图像

    我使用基于以下内容的脚本从用户上传的声音文件动态生成波形图像 http andrewfreiday com 2010 04 29 generate mp3 waveforms with php http andrewfreiday com
  • Rspec Capybara 测试与 ajax 调用不更新记录

    我有一个表单 当用户提交带有单个名称字段的 ajax 表单时 会创建一条属于 Template 对象的记录 这一切都可以手动正常工作 但由于某种原因 当我通过 rspec 测试它时 它告诉我该关联尚未创建 为什么这里没有更新模板对象 des
  • 如何从 ASCII 文件读取数字 (C++)

    我需要读取如下所示的数据文件 SZA 10 00 2 648 2 648 2 648 2 648 2 648 2 648 2 648 2 649 2 650 2 650 2 652 2 653 2 652 2 653 2 654 2 654
  • ServiceStack:DTO 中没有 IReturn 的 JsonServiceClient 使用

    我想做的是 var client new JsonServiceClient ServiceUrl var request new FooQuery Id 1 IEnumerable
  • 如何隐藏模式对话框而不从 .ShowDialog 返回?

    我在 vb net 中有一个应用程序 它以子函数开始 执行一些操作并决定它是否显示自己 当它出现时 它会调用dialog ShowDialog When dialog ShowDialog 返回 应用程序进行一些清理并结束 我想找到一种方法
  • 导轨闪烁,但未显示警告、警报和错误;仅显示通知

    在我看来 我有 当页面渲染时 仅出现带有通知闪存的蓝色信息框 另外两个将不会显示 等号也会发生同样的情况 我的 Rails 应用程序中是否有一个设置可以设置警告或错误闪烁不出现 我对以
  • 从序列创建关系矩阵 (Matlab)

    我有一个序列 S S ABCD which means A
  • TwiML 应用程序:如果呼叫者在应用程序过程中挂断,Twilio 是否会通知应用程序挂断?

    我正在尝试找出一种方法来捕获调用者是否在 TwiML 指令中间挂断 如果呼叫者挂断 放弃呼叫 twilio 是否会通知应用程序 我看到状态回调 url 设置 但我只得到 已完成 状态 我想知道如果呼叫者正在聚会并挂断电话 twilio 会知
  • 组件函数运行多次react

    我正在制作一个基于的显示页面match params来自react router 4 出于某种原因 某些函数运行了3次 这给了我前两次未定义的结果 第三次给出了我想要的结果 所以我有这个 Show 组件 它具有来自主组件的道具 项目 在这个
  • 只能应用于给定类类型的扩展

    我想创建一个只有 UIView 的子类才能遵守的协议 有没有办法做到这一点 The Protocol protocol MyProtocol func someMethod This works fine class MyView UIVi
  • 不返回 group_concat 具有空值的行

    我有以下 MySQL 查询 该查询应该从表 a 和 b 一对多关系 返回记录 以及从表 c 返回的任何值的逗号分隔列表 但是 表 c 中并不总是有记录 这就是为什么我使用 LEFT OUTER JOIN 将其连接到表 a SELECT a
  • C2059 语法错误“字符串”?

    extern C endif include
  • 如何抑制Excel下载时的文件损坏警告?

    我有一个链接到 Excel 2007 工作表的网页 它是一个 xls文件而不是 xlsx文件 当我单击链接时 我会看到通常的对话框 用于打开 保存 Excel 文件 单击 打开 后 我收到以下警告消息 您尝试打开的文件 filename x
  • 如何在没有 Visual Studio 的情况下安装 MSBuild 15.3?

    有没有办法在构建服务器上安装 MSBuild 15 3 版本而不安装 Visual Studio 2017 我尝试安装 Build Tools for Visual Studio 2017 https www visualstudio co
  • 在页面中央打印 html 文本

    我有一个下一个问题 试图用谷歌找到它 但没有找到什么可以帮助我 我有一个大的 HTML 文件需要打印 我使用 CSS 来分隔页面break after 问题是 如何在页面中央打印一个元素 不仅是水平居中 而且是垂直居中 HTML 看起来像这
  • 如何获取制表符?

    在 HTML 中 选项卡没有字符 但我很困惑为什么我可以在此处复制并粘贴一个字符 您看不到它的完整宽度 但如果您单击编辑我的问题 您会看到该字符 如果我可以复制并粘贴制表符 那么应该有一个可以编码为 html 的 unicode 等效项 我
  • 使用 ADFS IdP 进行单点注销的正确 LogoutRequest

    我成功使用 OneLogin java saml 库进行 SAML SSO 但 Active Directory 联合身份验证服务 ADFS 的 SLO 单点注销 存在问题 该库创建的 LogoutRequest 被 ADFS 拒绝 但被
  • 点覆盖问题

    我最近在测试中遇到了这个问题 给定一组点m 全部在 x 轴上 和一组n具有端点的线 l r 再次在 x 轴上 找到 的最小子集n这样所有的点都被一条线覆盖 证明你的解决方案总是能找到最小子集 我为它编写的算法的效果是 假设线存储为数组 左端