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


    1.问题及答案

    问题:数轴上有n个区间,选出最多的区间,使得这些区间不互相重叠。
    算法:
    将所有区间按右端点坐标从小到大排序,顺序处理每个区间。如果它与当前已选的所有区间都没有重叠,则选择该区间,否则不选。
    有个类似的问题:56.合并区间

        @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);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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。

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

  • 相关阅读:
    通过事件绑定实现动画效果
    windows局域网传文件5种常用方法
    为什么 Spring和IDEA 都不推荐使用 @Autowired 注解
    vue3 集成 tailwindcss
    python3通过winrm远程执行windows服务器dos命令
    三维视频融合技术监控平台怎么做?原理算法是哪个公司在研发?
    springboot 使用 microsoft SQL server 报错
    sqllab第二十七A关通关笔记
    5000+封号血泪史,造就这16条WhatsApp防死号秘籍
    高等教育学:课程
  • 原文地址:https://blog.csdn.net/Allenlzcoder/article/details/134262026