区间调度问题及贪心算法证明

1.问题及答案

问题:数轴上有n个区间,选出最多的区间,使得这些区间不互相重叠。

算法:

将所有区间按右端点坐标从小到大排序,顺序处理每个区间。如果它与当前已选的所有区间都没有重叠,则选择该区间,否则不选。

java 复制代码
    @Test
    public void intervalSchedule() {
        int[][] array = new int[][]{{1, 2}, {3, 4}, {5, 6}, {1, 5}, {2, 3}};
        Collections.sort(Arrays.asList(array), Comparator.comparingInt(o -> o[1]));
        int count = 1;
        int yRight = array[0][1];
        for (int i = 1; i < array.length; ++i) {
            if (array[i][0] >= yRight) {
                ++count;
                yRight = array[i][1];
            }
        }
        System.out.println("不重叠子区间的最大数量为 = " + count);
    }

2.贪心算法证明

参考链接:https://blog.csdn.net/luoweifu/article/details/18195607

证明:

显然,该算法最后选出的区间不互相重叠,下面证明所选出区间的数量是最多的。设fi为该算法所接受的第i个区间的右端点坐标,gi为某最优解中的第i个区间的右端点坐标。

命题1.1 当i >= 1时,该算法所接受的第i个区间的右端点坐标fi <= 某最优解中的第i个区间的右端点坐标gi

该命题可以运用数学归纳法来证明。对于i=1,命题显然为真,因为算法第一个选择的区间拥有最小右端点坐标。令i>1,假定论断对i-1为真,即fi-1<=gi-1。则最优解的第i个可选区间所组成的集合包含于执行该算法时第i个可选区间所组成的集合;而当算法选择第i个区间时,选的是在可选区间中右端点坐标最小的一个,所以有fi<=gi。证毕。

设该算法选出了k个区间,而最优解选出了m个区间。

命题1.2 最优解选出的区间数量m = 该算法选出的区间数量k

假设m>k,根据命题1.1,有fk<=gk。由于m>k,必然存在某区间,在gk之后开始,故也在fk之后开始。而该算法一定不会在选了第k个区间后停止,还会选择更多的区间,产生矛盾。所以m<=k,又因为m是最优解选出区间个数,所以m=k。

综上所述,算法选出的区间是最优解。

相关推荐
余衫马15 分钟前
聚类算法入门:像魔法一样把数据自动归类
人工智能·算法·机器学习·聚类
CAU界编程小白25 分钟前
数据结构系列之快速排序
数据结构·c++·算法
卡提西亚41 分钟前
一本通网站1130:找第一个只出现一次的字符
数据结构·c++·笔记·算法·一本通
luoganttcc1 小时前
DiffusionVLA 与BridgeVLA 相比 在 精度和成功率和效率上 有什么 优势
人工智能·算法
CoovallyAIHub1 小时前
注意力机制不再计算相似性?清华北大新研究让ViT转向“找差异”,效果出奇制胜
深度学习·算法·计算机视觉
CoovallyAIHub1 小时前
从图像导数到边缘检测:探索Sobel与Scharr算子的原理与实践
深度学习·算法·计算机视觉
蒙奇D索大1 小时前
【算法】递归算法的深度实践:深度优先搜索(DFS)从原理到LeetCode实战
c语言·笔记·学习·算法·leetcode·深度优先
一匹电信狗2 小时前
【C++11】右值引用+移动语义+完美转发
服务器·c++·算法·leetcode·小程序·stl·visual studio
jz_ddk2 小时前
[实战] 卡尔曼滤波原理与实现(GITHUB 优秀库解读)
算法·github·信号处理·kalman filter·卡尔曼滤波
啊吧怪不啊吧2 小时前
一维前缀和与二维前缀和算法介绍及使用
数据结构·算法