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

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);
    }

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。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
区间调度问题是指在一些活动中选择一些互不冲突的活动,使得能够完成的活动数最多。贪心算法是一种常用的解决该问题的方法。下面是该算法证明过程: 假设存在最优解S,其中包含n个活动。我们将这些活动按照结束时间的先后顺序排列,即e1≤e2≤...≤en。我们用A1表示S中结束时间最早的活动,用Ak表示S中结束时间最晚的活动。我们假设Ak不在贪心算法得到的结果集中,而是选择了另一个活动Aj。因为Ak结束时间最晚,所以Aj的结束时间一定不晚于Ak,即ej≥ek。而根据贪心算法,Ak是在所有结束时间不早于ej的活动中结束时间最晚的,所以Ak的结束时间不晚于Aj,即ek≥ej。因此,ej=ek,即Ak和Aj的结束时间相同。但是,由于Ak是S中结束时间最晚的活动,所以Aj不可能在S中,与假设矛盾。因此,Ak一定在贪心算法得到的结果集中。 接下来,我们用数学归纳法证明贪心算法得到的结果集是最优解。假设贪心算法得到的结果集为S,其中包含m个活动。我们将这些活动按照结束时间的先后顺序排列,即e1≤e2≤...≤em。我们用B1表示S中结束时间最早的活动,用Bk表示S中结束时间最晚的活动。我们假设Bk在最优解中的位置是i,即Bk是最优解中的第i个活动。因为Bk是S中结束时间最晚的活动,所以在最优解中,前i-1个活动的结束时间一定不晚于ek,即ei-1≥ek。而根据贪心算法,Bk是在所有结束时间不早于ei-1的活动中结束时间最晚的,所以Bk的结束时间不早于最优解中前i-1个活动的结束时间,即ej≥ei-1。因此,ei-1≥ek≤ej,即Bk和Bi-1的结束时间相同。但是,由于Bk是最优解中结束时间最晚的活动,所以Bi-1不可能在最优解中的位置在i之后,即Bi-1在最优解中的位置一定在i之前。因此,我们可以将Bi-1替换成Bk,得到一个包含m-1个活动的最优解。根据数学归纳法,贪心算法得到的结果集是最优解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值