Skip to content

Commit b2d18b8

Browse files
committed
feat: Add SlackTimeScheduling new algorithm with Junit tests
1 parent bcf4034 commit b2d18b8

File tree

2 files changed

+100
-0
lines changed

2 files changed

+100
-0
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
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+
public void addTask(String name, int executionTime, int deadline) {
41+
tasks.add(new Task(name, executionTime, deadline));
42+
}
43+
44+
public List<String> scheduleTasks() {
45+
tasks.sort(Comparator.comparingInt(Task::getSlackTime));
46+
List<String> scheduledOrder = new ArrayList<>();
47+
for (Task task : tasks) {
48+
scheduledOrder.add(task.name);
49+
}
50+
return scheduledOrder;
51+
}
52+
}
Lines changed: 48 additions & 0 deletions
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)