数据结构-五大基本算法-贪心算法

这篇博客介绍了贪心算法在解决多个班级音乐教室使用冲突问题上的应用。通过贪心选择性质和最优子结构,找到能容纳最多活动时间段的解决方案。文章提供了具体的Java代码示例,展示了如何实现该算法来确定最优的活动安排。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

贪心法会做出当前看来最好的选择结果,但是并不从整体考虑最优,它做出的只是局部最优。虽然贪心算法不能对所有问题都得到整体最优解,但是对许多问题它能产生整体最优解,如:单源最短路径问题,最小生成树。

2个重要性质:

1.贪心选择性质:

所求问题的最优解可以通过一系列局部最优的选择

2.最优子结构性质 :

当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质

贪心算法和 动态规划算法都具有 此性质

例题:

假定有N个班级,都需要使用音乐教室上课,他们的上课起止时间不同,求 该时间段内 音乐教师能容纳最多的活动时间段?

假定活动已按结束时间 fi 的单调递增顺序排序

JAVA代码演示:


/**
 * @Author wuxiaotian
 * @Date 2021/8/26 11:00
 * @Version C1.4
 */
public class Test03 {
    int[] OptimalSubset = new int[10];
    int[] s = new int[] {1,3,0,5,3,5,6,8,8,2,12};
    int[] f = new int[] {4,5,6,7,8,9,10,11,12,13,14};
    
    public  int GreedyActivitySelector(int[] s, int[] f,int n){ /**迭代贪心算法**/
        int activityNum = 0;
        OptimalSubset[activityNum ++] = 1;//第一个活动是必选的
        int index  = 1;
        int m;
        for (m = 2; m <= n; m++) {
            if(s[m] >= f[index]){ //寻找下一个开始时间 > 当前活动结束时间的
                OptimalSubset[activityNum++] = m; //存储找到的活动
                index = m;//继续寻找下一个开始时间
            }
        }
        return activityNum;
    }

    public static void main(String[] args) {
        Test03 test03 = new Test03();
        // test03.f.length - 1 )下标从0开始的
        int i = test03.GreedyActivitySelector(test03.s, test03.f, test03.f.length - 1);
        System.out.println(i);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值