Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 需要有效的贪婪来覆盖线段_Algorithm_Geometry - Fatal编程技术网

Algorithm 需要有效的贪婪来覆盖线段

Algorithm 需要有效的贪婪来覆盖线段,algorithm,geometry,Algorithm,Geometry,给定n段线(进入X轴),坐标为[li;ri]。你要选择 覆盖该段的最小段数[0;M]。设计了一个贪心算法来实现 解决这个问题 以下是我所做的: 按起点按递增顺序排序,然后我选择最长的一个,第二个最长的。。。。但这里有一个问题:假设我们想要凹进[0,12]段,有3段:[0,5],[5,12],[0,10]。按照这个算法,它将需要[0,10],然后它不会覆盖所有的段,但是如果我们使用另外两个,它将覆盖所有的段 你们还有别的想法吗?如果不进行排序和获取最长的行,则无法工作。我们希望涵盖[0,12]段,

给定n段线(进入X轴),坐标为[li;ri]。你要选择 覆盖该段的最小段数[0;M]。设计了一个贪心算法来实现 解决这个问题

以下是我所做的: 按起点按递增顺序排序,然后我选择最长的一个,第二个最长的。。。。但这里有一个问题:假设我们想要凹进[0,12]段,有3段:[0,5],[5,12],[0,10]。按照这个算法,它将需要[0,10],然后它不会覆盖所有的段,但是如果我们使用另外两个,它将覆盖所有的段

你们还有别的想法吗?如果不进行排序和获取最长的行,则无法工作。我们希望涵盖[0,12]段,共有5段:[0,2][2,10][10,12][0,6][6,12] 按照我们的算法选择前三个,但最后两个是最佳的

你们还有别的想法吗


我能想到一个非常糟糕的N^N算法

我认为它不需要是不相交的封面,也可以使用重叠封面。在您的示例中,只需取[0,10],然后取[5,12]。首先查看从0开始的所有线段,然后查找最长的线段。我们称之为[0,m],接下来看所有线段[a,b],这样am取最大m的线段。以这种方式迭代地继续。它需要| N |*| C |,其中N是线段的数量,C是覆盖直线的线段数量。

我假设重叠间隔很好,只要它给出最佳答案

在我进一步讨论之前,我想问一下,你们是否知道为什么你们贪婪的方法不能给出最佳答案?(在阅读下一段之前,请思考一分钟。)

如果你还不明白为什么,让我告诉你。您总是选择最长间隔(排序后),但它可能不是覆盖未覆盖间隔段的最长间隔。假设你有0-10,5-14,9-15。如果按最长间隔拾取,则将拾取所有线段。拾取第一段后,拾取第二段仅额外包含4个单位,而拾取第三段则额外包含5个单位。所以很明显,基于最长间隔长度的拣选并不能给出最优解


我想你现在明白了。考虑到它被标记为家庭作业,如果我提出超出这一点的解决方案是不合适的。

你至少可以对家庭作业进行解释,而不是剪切粘贴。这可能违反了你们学校的荣誉准则,对吗?如果我们给你什么,我们只会给你提示,而不是答案。贪婪意味着一旦你在解决方案中加入了某些元素,你就再也不会回去重新考虑决定了。订单由你决定。所以你刚刚发现长度的顺序不对。试着下一道菜,这是我想到的下一道菜。只要找到反例,如果你这样做了,表明你接近解决方案。这样做就像是放弃,你学的东西不如自己解决它,尤其是你没有信心自己能解决它。