Java- 多机调度(贪心算法)

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java- 多机调度(贪心算法)相关的知识,希望对你有一定的参考价值。

问题描述

有n台规格一样的机器同时工作,有m个零件需要加工,第 i个零件加工时间为 ti,请你计算出加工完这批零件最少需要多少时间。

算法分析

  • m<=n零件数小于机器数 时,直接分配即可,最长加工时间结果
  • m>n
    • 首先将零件按照加工时间排序,每次分配都将最长加工时间的零件,分配给当前总加工时间最短的机器,这样便是最优选择
    • 如果我们每次是将需要处理时间最短的作业分配给空闲的机器,那么可能就会出现其它所有作业都处理完了只剩所需时间最长的作业在处理的情况,这样势必效率较低。

代码实现

Java中提供的优先队列 PriorityQueue<> 可以很好为我们提供方便。具体请参考一下 OJ题目 及实现代码。

输入: 第一行为两个整数n,m。n表示机器数,m表示零件数(1<=n<=1e3,1<=m<=1e5)。
接下来一行m个整数为每个零件需要的加工时间(1<=ti<=1e3)。
输出:加工所有零件需要的最少时间。
样例输入:
3 5 2 3 4 5 6
样例输出:
7

代码展示

import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;
 
class Machine {
    int time;
}
 
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
 		// 创建优先队列,参数是 Machine类,自定义排序
        PriorityQueue<Machine> queue = new PriorityQueue<>((o1, o2)->o1.time-o2.time);
 
        for (int i = 0; i < n; i++) {
            queue.add(new Machine());
        }
        int[] x = new int[m];
        for (int i = 0; i < m; i++) {
            x[i] = sc.nextInt();
        }
		// 将零件升序排序
        Arrays.sort(x);
        // 遍历
        for (int i = m-1; i >= 0; i--) {
            Machine m1 = queue.poll();
            m1.time += x[i];
            queue.offer(m1);
        }
        // 输出最大的time,即队列尾部的 Machine.time
        for (int i = 0; i < n; i++) {
            if (i == n-1)
                System.out.println(queue.poll().time);
            else
                queue.poll();
        }
    }
}

感谢 Everything
努力前行, 奋斗不止
加油!

以上是关于Java- 多机调度(贪心算法)的主要内容,如果未能解决你的问题,请参考以下文章

算法导论贪心算法—排队等待问题单位时间的调度问题0-1背包贪心近似多机调度问题

多机调度问题

(贪心)多机调度问题

多机调度问题

算法分析与设计题目

贪心算法之区间调度问题