Skip to content

Commit 92a04f8

Browse files
authored
Add SlackTimeScheduling algorithm (#5814)
1 parent 59a8e1d commit 92a04f8

File tree

3 files changed

+114
-0
lines changed

3 files changed

+114
-0
lines changed

DIRECTORY.md

+2
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,7 @@
539539
* [PreemptivePriorityScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/PreemptivePriorityScheduling.java)
540540
* [RRScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/RRScheduling.java)
541541
* [SJFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/SJFScheduling.java)
542+
* [SlackTimeScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/SlackTimeScheduling.java)
542543
* [SRTFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/SRTFScheduling.java)
543544
* searches
544545
* [BinarySearch](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/searches/BinarySearch.java)
@@ -1134,6 +1135,7 @@
11341135
* [PreemptivePrioritySchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/PreemptivePrioritySchedulingTest.java)
11351136
* [RRSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/RRSchedulingTest.java)
11361137
* [SJFSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/SJFSchedulingTest.java)
1138+
* [SlackTimeSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/SlackTimeSchedulingTest.java)
11371139
* [SRTFSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/SRTFSchedulingTest.java)
11381140
* searches
11391141
* [BinarySearch2dArrayTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/BinarySearch2dArrayTest.java)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.thealgorithms.scheduling;
2+
3+
import java.util.ArrayList;
4+
import java.util.Comparator;
5+
import java.util.List;
6+
7+
/**
8+
* SlackTimeScheduling is an algorithm that prioritizes tasks based on their
9+
* slack time, which is defined as the difference between the task's deadline
10+
* and the time required to execute it. Tasks with less slack time are prioritized.
11+
*
12+
* Use Case: Real-time systems with hard deadlines, such as robotics or embedded systems.
13+
*
14+
* @author Hardvan
15+
*/
16+
public class SlackTimeScheduling {
17+
18+
static class Task {
19+
String name;
20+
int executionTime;
21+
int deadline;
22+
23+
Task(String name, int executionTime, int deadline) {
24+
this.name = name;
25+
this.executionTime = executionTime;
26+
this.deadline = deadline;
27+
}
28+
29+
int getSlackTime() {
30+
return deadline - executionTime;
31+
}
32+
}
33+
34+
private final List<Task> tasks;
35+
36+
public SlackTimeScheduling() {
37+
tasks = new ArrayList<>();
38+
}
39+
40+
/**
41+
* Adds a task to the scheduler.
42+
*
43+
* @param name the name of the task
44+
* @param executionTime the time required to execute the task
45+
* @param deadline the deadline by which the task must be completed
46+
*/
47+
public void addTask(String name, int executionTime, int deadline) {
48+
tasks.add(new Task(name, executionTime, deadline));
49+
}
50+
51+
/**
52+
* Schedules the tasks based on their slack time.
53+
*
54+
* @return the order in which the tasks should be executed
55+
*/
56+
public List<String> scheduleTasks() {
57+
tasks.sort(Comparator.comparingInt(Task::getSlackTime));
58+
List<String> scheduledOrder = new ArrayList<>();
59+
for (Task task : tasks) {
60+
scheduledOrder.add(task.name);
61+
}
62+
return scheduledOrder;
63+
}
64+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.thealgorithms.scheduling;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import java.util.List;
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.Test;
8+
9+
public class SlackTimeSchedulingTest {
10+
11+
private SlackTimeScheduling scheduler;
12+
13+
@BeforeEach
14+
public void setup() {
15+
scheduler = new SlackTimeScheduling();
16+
}
17+
18+
@Test
19+
public void testAddAndScheduleSingleTask() {
20+
scheduler.addTask("Task1", 2, 5);
21+
List<String> expected = List.of("Task1");
22+
assertEquals(expected, scheduler.scheduleTasks());
23+
}
24+
25+
@Test
26+
public void testScheduleMultipleTasks() {
27+
scheduler.addTask("Task1", 2, 5);
28+
scheduler.addTask("Task2", 1, 4);
29+
scheduler.addTask("Task3", 3, 7);
30+
List<String> expected = List.of("Task1", "Task2", "Task3");
31+
assertEquals(expected, scheduler.scheduleTasks());
32+
}
33+
34+
@Test
35+
public void testScheduleTasksWithSameSlackTime() {
36+
scheduler.addTask("Task1", 2, 5);
37+
scheduler.addTask("Task2", 3, 6);
38+
scheduler.addTask("Task3", 1, 4);
39+
List<String> expected = List.of("Task1", "Task2", "Task3");
40+
assertEquals(expected, scheduler.scheduleTasks());
41+
}
42+
43+
@Test
44+
public void testEmptyScheduler() {
45+
List<String> expected = List.of();
46+
assertEquals(expected, scheduler.scheduleTasks());
47+
}
48+
}

0 commit comments

Comments
 (0)