贪心法求解三种有关区间覆盖问题

简介:                                                基于贪心算法的几类区间覆盖问题 (1)区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(...

                                               基于贪心算法的几类区间覆盖问题

1)区间完全覆盖问题

问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖

样例:

区间长度8,可选的覆盖线段[2,6],[1,4],[3,6],[3,7],[6,8],[2,4],[3,5]

解题过程:

1将每一个区间按照左端点递增顺序排列,拍完序后为[1,4][2,4][2,6][3,5][3,6][3,7][6,8]

2设置一个变量表示已经覆盖到的区域。再剩下的线段中找出所有左端点小于等于当前已经覆盖到的区域的右端点的线段中,右端点最大的线段在加入,直到已经覆盖全部的区域

3过程:

假设第一步加入[1,4],那么下一步能够选择的有[2,6][3,5][3,6][3,7],由于7最大,所以下一步选择[3,7],最后一步只能选择[6,8],这个时候刚好达到了8退出,所选区间为3

4贪心证明:

需要最少的线段进行覆盖,那么选取的线段必然要尽量长,而已经覆盖到的区域之前的地方已经无所谓了,(可以理解成所有的可以覆盖的左端点都是已经覆盖到的地方),那么真正能够使得线段更成的是右端点,左端点没有太大的意义,所以选择右端点来覆盖

2)最大不相交覆盖

问题描述: 给定一个长度为m的区间,再给出n条线段的起点和终点(开区间和闭区间处理的方法是不同,这里以开区间为例),问题是从中选取尽量多的线段,使得每个线段都是独立的,就是不和其它有任何线段有相交的地方
样例:

区间长度8,可选的覆盖线段[2,6],[1,4],[3,6],[3,7],[6,8],[2,4],[3,5]

解题过程:

对线段的右端点进行升序排序,每加入一个线段,然后选择后面若干个(也有可能是一个)右端点相同的线段,选择左端点最大的那一条,如果加入以后不会跟之前的线段产生公共部分,那么就加入,否则就继续判断后面的线段

1 排序: 将每一个区间按右端点进行递增顺序排列,拍完序后为[1,4][2,4][2,6][3,5][3,6][3,7][6,8]

2 第一步选取[2,4],发现后面只能加入[6,8],所以区间的个数为2
3 贪心证明: 因为需要尽量多的独立的线段,所以每个线段都尽可能的小,对于同一右端点,左端点越大,线段长度越小。那么为什么要对右端点进行排序呢?如果左端点进行排序,那么右端点是多少并不知道,那么每一条线段都不能对之前所有的线段进行一个总结,那么这就明显不满足贪心的最有字结构了。

3)区间选点问题

问题描述:给定一个长度为m的区间,再给出n条线段和这n条线段需要满足的要求(要求是这n条线段上至少有的被选择的点的个数),问题是整个区间内最少选择几个点,使其满足每一条线段的要求.

样例:略

解题过程:将每个线段按照终点坐标进行递增排序,相同终点的前点坐标大的在前面,一个个将其满足

贪心证明: 要想使得剩下的线段上选择的点最少,那么就应该尽量使得已经选择了的点尽量能在后面的线段中发挥作用,而我们是从左往右选择线段的,那么要使得选取的点能满足后面线段的要求,那么必须是从线段的有端点开始选点,那么问题(2)一样涉及到一个问题,如果是按照线段的左端点对线段进行排序的话,不知道右端点的话,每一条线段都不能对之前已经操作过的所有线段进行一个总结,那么这就同样不满足贪心算法的最优子结构性质了。

可以解决的实际问题:数轴上面有n个闭区间[a,b],取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)








目录
相关文章
|
6月前
|
存储 人工智能 自然语言处理
动态规划算法总结
动态规划算法总结
|
9月前
|
存储 算法 搜索推荐
动态规划算法
动态规划算法是一种常用的优化问题求解方法,主要用于解决具有重叠子问题和最优子结构性质的问题。动态规划算法的基本思想是将原问题拆分成若干个子问题,通过求解子问题的最优解来求解原问题的最优解。动态规划算法通常包含以下三个步骤:
70 2
|
9月前
|
机器学习/深度学习 人工智能 JavaScript
动态规划算法(二)
动态规划算法
44 0
|
9月前
|
机器学习/深度学习 自然语言处理
动态规划算法(一)
动态规划算法
66 0
|
11月前
|
Linux API iOS开发
|
算法
秒懂算法 | 递推方程求解方法
时间复杂度和空间复杂度表示为递推方程的两种求解方法。
220 1
秒懂算法 | 递推方程求解方法
|
缓存 算法 网络协议
贪心法
贪心法是把一个复杂问题分解为一系列较为简单的局部最优选择,每一步选择都是对当前解的一个扩展,直到获得问题的完整解。贪心法的典型应用是求解最优化问题,而且对许多问题都能得到整体最优解,即使不能得到整体最优解,通常也是最优解的很好近似。
|
存储 缓存 移动开发
动态规划法
动态规划是在20世纪50年代由美国数学家贝尔曼为研究最优控制问题而提出的,当该方法在应用数学中的价值被大家认同以后,在计算机学界,动态规划法成为一种通用的算法设计技术用来求解多阶段决策最优化问题。
|
存储
【贪心法】程序存储问题
【贪心法】程序存储问题
144 0
【贪心法】程序存储问题