📜  活动选择问题的Java程序|贪心算法-1(1)

📅  最后修改于: 2023-12-03 15:11:05.300000             🧑  作者: Mango

活动选择问题的Java程序|贪心算法-1

本文介绍了一个使用贪心算法解决活动选择问题的Java程序。活动选择问题是指在一段时间内,有多个活动可供选择,每个活动有一个开始时间和结束时间,选择哪些活动使得选择的活动数量最多。

算法分析

我们可以将活动按结束时间从早到晚排序,每次选择结束时间最早的活动,并排除与之冲突的活动。这样选择的活动数量就是最多的。

代码实现
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

class Activity {
    public int start;
    public int end;

    public Activity(int start, int end) {
        this.start = start;
        this.end = end;
    }

    public static Comparator<Activity> cmp = new Comparator<Activity>() {
        public int compare(Activity a1, Activity a2) {
            return a1.end - a2.end;
        }
    };
}

public class ActivitySelector {
    public static ArrayList<Activity> select(Activity[] activities) {
        ArrayList<Activity> result = new ArrayList<Activity>();

        // 按结束时间从早到晚排序
        Arrays.sort(activities, Activity.cmp);
        int lastEnd = -1;

        for (int i = 0; i < activities.length; i++) {
            if (activities[i].start >= lastEnd) {
                result.add(activities[i]);
                lastEnd = activities[i].end;
            }
        }

        return result;
    }

    public static void main(String[] args) {
        Activity[] activities = new Activity[] {
                new Activity(1, 4),
                new Activity(3, 5),
                new Activity(0, 6),
                new Activity(5, 7),
                new Activity(3, 8),
                new Activity(5, 9),
                new Activity(6, 10),
                new Activity(8, 11),
                new Activity(8, 12),
                new Activity(2, 13),
                new Activity(12, 14),
        };
        ArrayList<Activity> result = ActivitySelector.select(activities);
        for (int i = 0; i < result.size(); i++) {
            Activity activity = result.get(i);
            System.out.println("activity " + i + ": [" + activity.start + ", " + activity.end + "]");
        }
    }
}
代码释义

代码中定义了一个Activity类,用于表示一个活动,包含开始时间和结束时间。Activity类实现了一个Comparator接口,用于按结束时间从早到晚排序。

ActivitySelector类实现了select方法,接受一个Activity数组作为参数,返回一组选择的活动。在方法中,我们先按结束时间从早到晚排序,然后遍历一遍数组,选择结束时间最早的可选活动。如果当前活动的开始时间晚于上一个活动的结束时间,我们将其加入结果中,并更新lastEnd变量为当前活动的结束时间。

main方法中,我们定义了一组测试数据,然后使用ActivitySelector类的select方法选择一组活动,并打印出结果。

总结

贪心算法是一种常用的解决优化问题的算法,它在每一步都选择当前最优解,最终得到全局最优解。在本文中,我们使用贪心算法解决了活动选择问题,并实现了一个Java程序。