mjain

Job Scheduling(topological sort)

Jul 15th, 2019
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.91 KB | None | 0 0
  1. package testrun;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.HashMap;
  6.  
  7. public class TopologicalSort {
  8.  
  9.     public static class JobNode {
  10.         int                jobId;
  11.         ArrayList<JobNode> dependies          = new ArrayList<JobNode>();
  12.         int                noOfPrerequisitive = 0;
  13.  
  14.         public JobNode(int jobId) {
  15.             super();
  16.             this.jobId = jobId;
  17.         }
  18.  
  19.         public void addDep(JobNode n) {
  20.             if (dependies == null) {
  21.                 dependies = new ArrayList<JobNode>();
  22.  
  23.             }
  24.             dependies.add(n);
  25.         }
  26.  
  27.         public int getJobId() {
  28.             return jobId;
  29.         }
  30.  
  31.         public void setJobId(int jobId) {
  32.             this.jobId = jobId;
  33.         }
  34.  
  35.         public ArrayList<JobNode> getDependies() {
  36.             return dependies;
  37.         }
  38.  
  39.         public void setDependies(ArrayList<JobNode> dependies) {
  40.             this.dependies = dependies;
  41.         }
  42.  
  43.         public int getNoOfPrerequisitive() {
  44.             return noOfPrerequisitive;
  45.         }
  46.  
  47.         public void setNoOfPrerequisitive(int noOfPrerequisitive) {
  48.             this.noOfPrerequisitive = noOfPrerequisitive;
  49.         }
  50.  
  51.     }
  52.  
  53.     public static class JobGraph {
  54.         ArrayList<JobNode>        nodes = new ArrayList<JobNode>();
  55.         HashMap<Integer, JobNode> map   = new HashMap<Integer, JobNode>();
  56.  
  57.         public JobGraph(ArrayList<Integer> jobs) {
  58.             for (int j : jobs) {
  59.                 map.put(j, new JobNode(j));
  60.                 nodes.add(map.get(j));
  61.             }
  62.  
  63.         }
  64.  
  65.         public void addNode(Integer j) {
  66.             map.put(j, new JobNode(j));
  67.             nodes.add(map.get(j));
  68.         }
  69.  
  70.         public void addDependies(Integer j, Integer d) {
  71.             JobNode job = getNode(j);
  72.             JobNode dep = getNode(d);
  73.             if (job.dependies == null) {
  74.                 job.dependies = new ArrayList<JobNode>();
  75.             }
  76.             job.dependies.add(dep);
  77.             dep.noOfPrerequisitive++;
  78.         }
  79.  
  80.         public JobNode getNode(Integer n) {
  81.             if (!map.containsKey(n)) {
  82.                 addNode(n);
  83.             }
  84.  
  85.             return map.get(n);
  86.         }
  87.  
  88.         public ArrayList<JobNode> getNodes() {
  89.             return nodes;
  90.         }
  91.  
  92.         public void setNodes(ArrayList<JobNode> nodes) {
  93.             this.nodes = nodes;
  94.         }
  95.  
  96.         public HashMap<Integer, JobNode> getMap() {
  97.             return map;
  98.         }
  99.  
  100.         public void setMap(HashMap<Integer, JobNode> map) {
  101.             this.map = map;
  102.         }
  103.  
  104.     }
  105.  
  106.     public static ArrayList<Integer> topologicalSort(ArrayList<Integer> jobs, ArrayList<Integer[]> deps) {
  107.         ArrayList<Integer> jobsInOrder = new ArrayList<Integer>();
  108.         JobGraph graph = new JobGraph(jobs);
  109.         for (Integer[] d : deps) {
  110.             graph.addDependies(d[0], d[1]);
  111.         }
  112.         ArrayList<JobNode> jobWithNoPreq = new ArrayList<JobNode>();
  113.  
  114.         // get the indenpendent jobs first
  115.         for (JobNode job : graph.nodes) {
  116.             if (job.noOfPrerequisitive == 0) {
  117.                 jobWithNoPreq.add(job);
  118.             }
  119.         }
  120.         // traverse till independent jobs are done
  121.         while (!jobWithNoPreq.isEmpty()) {
  122.             int lastIndex = jobWithNoPreq.size() - 1;
  123.             JobNode node = jobWithNoPreq.get(lastIndex);
  124.             jobWithNoPreq.remove(lastIndex);
  125.             // add curent in final list
  126.             jobsInOrder.add(node.jobId);
  127.             // remove Dependents
  128.             while (!node.dependies.isEmpty()) {
  129.                 int index = node.dependies.size() - 1;
  130.                 JobNode dep = node.dependies.get(index);
  131.                 node.dependies.remove(index);
  132.                 dep.noOfPrerequisitive--;
  133.                 if (dep.noOfPrerequisitive == 0) {
  134.                     jobWithNoPreq.add(dep);
  135.                 }
  136.             }
  137.         }
  138.  
  139.         boolean isGraphHasCycle = false;
  140.         // ig any veritices still has edges
  141.         for (JobNode node : graph.nodes) {
  142.             if (node.noOfPrerequisitive > 0) {
  143.                 isGraphHasCycle = true;
  144.                 break;
  145.             }
  146.         }
  147.         return isGraphHasCycle ? new ArrayList<Integer>() : jobsInOrder;
  148.     }
  149.  
  150.     public static void main(String[] args) {
  151.         ArrayList<Integer> jobs = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4));
  152.         Integer[][] depsArray = new Integer[][] { { 1, 2 }, { 1, 3 }, { 3, 2 }, { 4, 2 }, { 4, 3 } };
  153.         ArrayList<Integer[]> deps = new ArrayList<Integer[]>();
  154.         fillDeps(depsArray, deps);
  155.         ArrayList<Integer> order = topologicalSort(jobs, deps);
  156.         System.out.print(order);
  157.     }
  158.  
  159.     static void fillDeps(Integer[][] depsArray, ArrayList<Integer[]> deps) {
  160.         for (Integer[] depArray : depsArray) {
  161.             deps.add(depArray);
  162.         }
  163.     }
  164.  
  165. }
Add Comment
Please, Sign In to add comment