热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

作业调度问题|集合3(利用Java中的TreeSet实现)

作业排序问题|集合 3(在 JAVA 中使用 TreeSet)原文:https://www . geesforgeks . or

作业排序问题|集合 3(在 JAVA 中使用 TreeSet)

原文:https://www . geesforgeks . org/job-sequence-problem-set-3-using-treeset-in-Java/

给定一系列工作,每个工作都有截止日期和相关利润(如果工作在截止日期前完成)。还假设每项工作只需要一个时间单位,因此任何工作的最小可能截止时间是 1。如果一次只能安排一个工作,如何使总利润最大化?

示例:

Input : Four Jobs with following deadlines and profits
JobID Deadline Profit
a 4 20
b 1 10
c 1 40
d 1 30
Output : Following is maximum profit sequence of jobs
c, a


Input : Five Jobs with following deadlines and profits
JobID Deadline Profit
a 2 100
b 1 19
c 2 27
d 1 25
e 3 15
Output : Following is maximum profit sequence of jobs
c, a, e

下面是在 Java 中使用 TreeSet 解决问题的分步算法:


  1. 将所有的工作按其各自的利润按降序排列。

  2. 创建一个树集合,插入从 0 到 n-1 的所有整数。

  3. 遍历作业数组,对于第 i 作业

    • 在树集中搜索最大值小于第 i 作业截止时间的时间段“x”。

    • 如果存在任何值,则在答案中包含该作业,并从树集中删除“x”

    • 否则检查剩余的作业。



下面是上述算法的实现:

import java.io.*;
import java.util.*;
public class Solution {
    // Job class
    public static class Job {
        char id;
        int deadline;
        int profit;
        // Constructor
        Job(char id, int deadline, int profit)
        {
            this.id = id;
            this.deadline = deadline;
            this.profit = profit;
        }
    }
    public static class Sorted implements Comparator {
        // Function to implement comparator
        public int compare(Object o1, Object o2)
        {
            Job j1 = (Job)o1;
            Job j2 = (Job)o2;
            if (j1.profit != j2.profit)
                return j2.profit - j1.profit;
            else
                return j2.deadline - j1.deadline;
        }
    }
    // Function to print job scheduling
    public static void printJobScheduling(Job jobs[], int n)
    {
        // Creating object of Sorted class
        Sorted sorter = new Sorted();
        Arrays.sort(jobs, sorter);
        // Creating TreeSet Object
        TreeSet<Integer> ts = new TreeSet<>();
        for (int i = 0; i < n; i++)
            ts.add(i);
        for (int i = 0; i < n; i++) {
            Integer x = ts.floor(jobs[i].deadline - 1);
            if (x != null) {
                System.out.print(jobs[i].id + " ");
                ts.remove(x);
            }
        }
    }
    // Driver Code
    public static void main(String[] args)
    {
        int n = 5;
        Job[] jobs = new Job[n];
        jobs[0] = new Job('a', 2, 100);
        jobs[1] = new Job('b', 1, 19);
        jobs[2] = new Job('c', 2, 27);
        jobs[3] = new Job('d', 1, 25);
        jobs[4] = new Job('e', 3, 15);
        printJobScheduling(jobs, n);
    }
    // Contributed by Dipesh Jain (dipesh_jain)
}

时间复杂度 : O(Nlog(N))
辅助空间* : O(N)


推荐阅读
  • 一个产品数组拼图|集合 2 (O(1)空间) ... [详细]
  • 程序打印菱形 ... [详细]
  • 本文详细介绍了Android平台上的动态加载技术,包括其定义、分类及具体实现步骤。通过动态加载技术,开发者可以在不更新应用的情况下,向用户推送新的功能或修复bug,从而提升用户体验。 ... [详细]
  • 快速排序是一种高效的排序算法,以其在多数情况下接近最优的性能而著称。本文将详细介绍如何在 Java 中实现快速排序,并分析其工作原理。 ... [详细]
  • 在现代多线程编程中,Lock接口提供的灵活性和控制力超越了传统的synchronized关键字。Lock接口不仅使锁成为一个独立的对象,还提供了更细粒度的锁定机制,例如读写锁(ReadWriteLock)。本文将探讨如何利用ReentrantReadWriteLock提高并发性能。 ... [详细]
  • 手把手教你构建简易JSON解析器
    本文将带你深入了解JSON解析器的构建过程,通过实践掌握JSON解析的基本原理。适合所有对数据解析感兴趣的开发者。 ... [详细]
  • 导读上一篇讲了zsh的常用字符串操作,这篇开始讲更为琐碎的转义字符和格式化输出相关内容。包括转义字符、引号、print、printf的使用等等。其中很多内容没有必要记忆,作为手册参 ... [详细]
  • 快速排序是基于分治策略的一种排序算法,其平均时间复杂度为O(n log n),在大多数情况下表现优于其他排序算法。本文将详细介绍快速排序的工作原理,并提供一个Java语言的具体实现。 ... [详细]
  • 本文详细探讨了 Java 中 Daemon 线程的特点及其应用场景,并深入分析了 Random 类的源代码,帮助开发者更好地理解和使用这些核心组件。 ... [详细]
  • 本文介绍了如何有效解决在Java编程中遇到的 'element cannot be mapped to a null key' 错误,通过具体的代码示例展示了问题的根源及解决方案。 ... [详细]
  • 本文详细介绍了Java中`org.sakaiproject.site.api.Site.addPage()`方法的功能和使用方法,并提供了多个实际项目中的代码示例。 ... [详细]
  • 本文通过一个具体的用户管理项目,详细介绍如何使用Spring MVC框架进行开发。从用户实体类的设计到控制器的实现,再到视图层的展示,全面解析Spring MVC的核心功能与实现细节。 ... [详细]
  • DP:InitiallyIthinkof1DDP,dp[i]standsfortheshorteststringoffirsticharacters,then:dp[i]minLe ... [详细]
  • 本文介绍了一个使用C++编写的算法,用于从给定的字符串中找出最长的连续重复子串。例如,对于输入字符串“ababc”,算法将返回“ab”。文中不仅提供了详细的代码实现,还分析了算法的时间和空间复杂度。 ... [详细]
  • Java编程中避免乱码问题的策略
    本文探讨了Java程序中产生乱码的根本原因及其解决方案,重点介绍了如何通过正确的编码设置来确保字符串的准确显示,以及在不同编码之间进行转换的技术。 ... [详细]
author-avatar
卢代马OR撸代码
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有