码迷,mamicode.com
首页 > 编程语言 > 详细

算法入门——区间贪心

时间:2021-06-02 18:06:20      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:完成后   要求   区间选点   排序   load   算法   bsp   最大   ima   

区间贪心

一、区间不相交问题

  问题描述:给出N个开区间(x,y),要求从这些开区间中选择尽可能多的开区间,使得这些开区间两两之间没有交集

  例如:对于(1,3)、(2,4)、(3,5)、(6,7)来说,可以选出最多的三个区间(1,3)、(3,5)、(6,7)

  这就是区间选择问题,所以在求解时,应该尽可能选择小的区间,这样才能包含更多的不相交区间

  下面用书中一张图来对算法进行描述

  技术图片

 

   首先a)中区间之间是包含关系,为了尽可能多的选择区间,所以应该保留区间1

  图b)中,把所有包含区间处理完成以后,可以将剩余区间进行排序,假设剩下的区间排序完成形成b)中情况,那么就可以看出I2,I3和三个区间都相交,I1只和I2,I3相交,显然选择I1这种区间是目前最优的,所以应该优先选择区间左端点最大的那个区间,如果这个区间的右端点与上一个选取的区间不相交,那么就应该保留这个区间,因为像图b)中,当I1被选取以后,对I2,I3,I4的右端点和I1的左端点进行判断是最便捷的方法。

  下面讨论怎么过滤包含区间,可以先将所有区间排列成类似图b)的形式,让左端点从大到小排序,如果左端点相同,就按右端点从小到大排序,然后按排序的顺序依次选择区间,假设有区间x(6,7)和y(6,8)显然区间x在区间y中,那么肯定首先选择区间x,而在排序算法中x刚好是拍在y之前的。对于(2,4)和(3,4)也是同理。

技术图片技术图片

 

 

 二、区间选点问题

  通过对上面的问题进行改变可以产生一个区间选点的问题,要求在给出的所有区间中选出数个点(小于等于区间个数),使每个区间中至少存在一个选出的点,区间为闭区间。其实这个问题就是对区间划分的一种变形,主要思想还是要找出所有不相交的区间,然后从这些区间里面选点,那么根据上面代码的思想,区间选点应该优先选择区间左侧的点,因为排序完成后,区间左边界是最有可能和其他区间相交的地方,这样即能选到当前区间的点,还有可能选到其他区间上的点。

  对上述代码进行修改时,只需要将I[i].y<=lastX改成小于就行,因为如果使用等号,那么会选择到两个区间的左端点刚好等于右端点,就是说两个区间刚好连续,那么就会选择重复的点。

  

  

算法入门——区间贪心

标签:完成后   要求   区间选点   排序   load   算法   bsp   最大   ima   

原文地址:https://www.cnblogs.com/zyq79434/p/14829338.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!