Skip to content

Commit 405ecce

Browse files
authored
Merge branch 'master' into SMJI/stack/min_max_const_time
2 parents b2b6fd1 + 9c76b30 commit 405ecce

16 files changed

+852
-0
lines changed

DIRECTORY.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@
8989
* [DecimalToBinary](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/DecimalToBinary.java)
9090
* [DecimalToHexadecimal](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/DecimalToHexadecimal.java)
9191
* [DecimalToOctal](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/DecimalToOctal.java)
92+
* [EndianConverter](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/EndianConverter.java)
9293
* [HexaDecimalToBinary](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/HexaDecimalToBinary.java)
9394
* [HexaDecimalToDecimal](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/HexaDecimalToDecimal.java)
9495
* [HexToOct](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/HexToOct.java)
@@ -99,6 +100,7 @@
99100
* [OctalToBinary](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/OctalToBinary.java)
100101
* [OctalToDecimal](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/OctalToDecimal.java)
101102
* [OctalToHexadecimal](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/OctalToHexadecimal.java)
103+
* [PhoneticAlphabetConverter](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/PhoneticAlphabetConverter.java)
102104
* [RgbHsvConversion](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/RgbHsvConversion.java)
103105
* [RomanToInteger](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/RomanToInteger.java)
104106
* [TurkishToLatinConversion](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/TurkishToLatinConversion.java)
@@ -503,6 +505,12 @@
503505
* Recursion
504506
* [GenerateSubsets](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/Recursion/GenerateSubsets.java)
505507
* scheduling
508+
* diskscheduling
509+
* [CircularLookScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/diskscheduling/CircularLookScheduling.java)
510+
* [CircularScanScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/diskscheduling/CircularScanScheduling.java)
511+
* [LookScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/diskscheduling/LookScheduling.java)
512+
* [ScanScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/diskscheduling/ScanScheduling.java)
513+
* [SSFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/diskscheduling/SSFScheduling.java)
506514
* [EDFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/EDFScheduling.java)
507515
* [FCFSScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/FCFSScheduling.java)
508516
* [HighestResponseRatioNextScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/HighestResponseRatioNextScheduling.java)
@@ -728,6 +736,7 @@
728736
* [DecimalToBinaryTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/conversions/DecimalToBinaryTest.java)
729737
* [DecimalToHexadecimalTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/conversions/DecimalToHexadecimalTest.java)
730738
* [DecimalToOctalTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/conversions/DecimalToOctalTest.java)
739+
* [EndianConverterTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/conversions/EndianConverterTest.java)
731740
* [HexaDecimalToBinaryTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/conversions/HexaDecimalToBinaryTest.java)
732741
* [HexaDecimalToDecimalTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/conversions/HexaDecimalToDecimalTest.java)
733742
* [HexToOctTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/conversions/HexToOctTest.java)
@@ -738,6 +747,7 @@
738747
* [OctalToBinaryTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/conversions/OctalToBinaryTest.java)
739748
* [OctalToDecimalTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/conversions/OctalToDecimalTest.java)
740749
* [OctalToHexadecimalTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/conversions/OctalToHexadecimalTest.java)
750+
* [PhoneticAlphabetConverterTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/conversions/PhoneticAlphabetConverterTest.java)
741751
* [RomanToIntegerTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/conversions/RomanToIntegerTest.java)
742752
* [UnitConversionsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/conversions/UnitConversionsTest.java)
743753
* [UnitsConverterTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/conversions/UnitsConverterTest.java)
@@ -919,6 +929,7 @@
919929
* [CeilTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/CeilTest.java)
920930
* [CollatzConjectureTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/CollatzConjectureTest.java)
921931
* [CombinationsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/CombinationsTest.java)
932+
* [ConvolutionTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/ConvolutionTest.java)
922933
* [CrossCorrelationTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/CrossCorrelationTest.java)
923934
* [DeterminantOfMatrixTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/DeterminantOfMatrixTest.java)
924935
* [DigitalRootTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/DigitalRootTest.java)
@@ -1042,6 +1053,12 @@
10421053
* Recursion
10431054
* [GenerateSubsetsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/Recursion/GenerateSubsetsTest.java)
10441055
* scheduling
1056+
* diskscheduling
1057+
* [CircularLookSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/diskscheduling/CircularLookSchedulingTest.java)
1058+
* [CircularScanSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/diskscheduling/CircularScanSchedulingTest.java)
1059+
* [LookSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/diskscheduling/LookSchedulingTest.java)
1060+
* [ScanSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/diskscheduling/ScanSchedulingTest.java)
1061+
* [SSFSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/diskscheduling/SSFSchedulingTest.java)
10451062
* [EDFSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/EDFSchedulingTest.java)
10461063
* [FCFSSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/FCFSSchedulingTest.java)
10471064
* [HighestResponseRatioNextSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/HighestResponseRatioNextSchedulingTest.java)
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.thealgorithms.conversions;
2+
3+
/**
4+
* Converts between big-endian and little-endian formats.
5+
* Big-endian is the most significant byte first, while little-endian is the least significant byte first.
6+
* Big-endian to little-endian: 0x12345678 -> 0x78563412
7+
*
8+
* Little-endian to big-endian: 0x12345678 -> 0x78563412
9+
*
10+
* @author Hardvan
11+
*/
12+
public final class EndianConverter {
13+
private EndianConverter() {
14+
}
15+
16+
public static int bigToLittleEndian(int value) {
17+
return Integer.reverseBytes(value);
18+
}
19+
20+
public static int littleToBigEndian(int value) {
21+
return Integer.reverseBytes(value);
22+
}
23+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.thealgorithms.conversions;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
/**
7+
* Converts text to the NATO phonetic alphabet.
8+
* Examples:
9+
* "ABC" -> "Alpha Bravo Charlie"
10+
* "Hello" -> "Hotel Echo Lima Lima Oscar"
11+
* "123" -> "One Two Three"
12+
* "A1B2C3" -> "Alpha One Bravo Two Charlie Three"
13+
*
14+
* @author Hardvan
15+
*/
16+
public final class PhoneticAlphabetConverter {
17+
private PhoneticAlphabetConverter() {
18+
}
19+
20+
private static final Map<Character, String> PHONETIC_MAP = new HashMap<>();
21+
22+
static {
23+
PHONETIC_MAP.put('A', "Alpha");
24+
PHONETIC_MAP.put('B', "Bravo");
25+
PHONETIC_MAP.put('C', "Charlie");
26+
PHONETIC_MAP.put('D', "Delta");
27+
PHONETIC_MAP.put('E', "Echo");
28+
PHONETIC_MAP.put('F', "Foxtrot");
29+
PHONETIC_MAP.put('G', "Golf");
30+
PHONETIC_MAP.put('H', "Hotel");
31+
PHONETIC_MAP.put('I', "India");
32+
PHONETIC_MAP.put('J', "Juliett");
33+
PHONETIC_MAP.put('K', "Kilo");
34+
PHONETIC_MAP.put('L', "Lima");
35+
PHONETIC_MAP.put('M', "Mike");
36+
PHONETIC_MAP.put('N', "November");
37+
PHONETIC_MAP.put('O', "Oscar");
38+
PHONETIC_MAP.put('P', "Papa");
39+
PHONETIC_MAP.put('Q', "Quebec");
40+
PHONETIC_MAP.put('R', "Romeo");
41+
PHONETIC_MAP.put('S', "Sierra");
42+
PHONETIC_MAP.put('T', "Tango");
43+
PHONETIC_MAP.put('U', "Uniform");
44+
PHONETIC_MAP.put('V', "Victor");
45+
PHONETIC_MAP.put('W', "Whiskey");
46+
PHONETIC_MAP.put('X', "X-ray");
47+
PHONETIC_MAP.put('Y', "Yankee");
48+
PHONETIC_MAP.put('Z', "Zulu");
49+
PHONETIC_MAP.put('0', "Zero");
50+
PHONETIC_MAP.put('1', "One");
51+
PHONETIC_MAP.put('2', "Two");
52+
PHONETIC_MAP.put('3', "Three");
53+
PHONETIC_MAP.put('4', "Four");
54+
PHONETIC_MAP.put('5', "Five");
55+
PHONETIC_MAP.put('6', "Six");
56+
PHONETIC_MAP.put('7', "Seven");
57+
PHONETIC_MAP.put('8', "Eight");
58+
PHONETIC_MAP.put('9', "Nine");
59+
}
60+
61+
public static String textToPhonetic(String text) {
62+
StringBuilder phonetic = new StringBuilder();
63+
for (char c : text.toUpperCase().toCharArray()) {
64+
phonetic.append(PHONETIC_MAP.getOrDefault(c, String.valueOf(c))).append(" ");
65+
}
66+
return phonetic.toString().trim();
67+
}
68+
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package com.thealgorithms.scheduling.diskscheduling;
2+
3+
import java.util.ArrayList;
4+
import java.util.Collections;
5+
import java.util.List;
6+
7+
/**
8+
* Circular Look Scheduling (C-LOOK) is a disk scheduling algorithm similar to
9+
* the C-SCAN algorithm but with a key difference. In C-LOOK, the disk arm also
10+
* moves in one direction to service requests, but instead of going all the way
11+
* to the end of the disk, it only goes as far as the furthest request in the
12+
* current direction. After servicing the last request in the current direction,
13+
* the arm immediately jumps back to the closest request on the other side without
14+
* moving to the disk's extreme ends. This reduces the unnecessary movement of the
15+
* disk arm, resulting in better performance compared to C-SCAN, while still
16+
* maintaining fair wait times for requests.
17+
*/
18+
public class CircularLookScheduling {
19+
private int currentPosition;
20+
private boolean movingUp;
21+
private final int maxCylinder;
22+
23+
public CircularLookScheduling(int startPosition, boolean movingUp, int maxCylinder) {
24+
this.currentPosition = startPosition;
25+
this.movingUp = movingUp;
26+
this.maxCylinder = maxCylinder;
27+
}
28+
29+
public List<Integer> execute(List<Integer> requests) {
30+
List<Integer> result = new ArrayList<>();
31+
32+
// Filter and sort valid requests in both directions
33+
List<Integer> upRequests = new ArrayList<>();
34+
List<Integer> downRequests = new ArrayList<>();
35+
36+
for (int request : requests) {
37+
if (request >= 0 && request < maxCylinder) {
38+
if (request > currentPosition) {
39+
upRequests.add(request);
40+
} else if (request < currentPosition) {
41+
downRequests.add(request);
42+
}
43+
}
44+
}
45+
46+
Collections.sort(upRequests);
47+
Collections.sort(downRequests);
48+
49+
if (movingUp) {
50+
// Process all requests in the upward direction
51+
result.addAll(upRequests);
52+
53+
// Jump to the lowest request and process all requests in the downward direction
54+
result.addAll(downRequests);
55+
} else {
56+
// Process all requests in the downward direction (in reverse order)
57+
Collections.reverse(downRequests);
58+
result.addAll(downRequests);
59+
60+
// Jump to the highest request and process all requests in the upward direction (in reverse order)
61+
Collections.reverse(upRequests);
62+
result.addAll(upRequests);
63+
}
64+
65+
// Update current position to the last processed request
66+
if (!result.isEmpty()) {
67+
currentPosition = result.get(result.size() - 1);
68+
}
69+
70+
return result;
71+
}
72+
73+
public int getCurrentPosition() {
74+
return currentPosition;
75+
}
76+
77+
public boolean isMovingUp() {
78+
return movingUp;
79+
}
80+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.thealgorithms.scheduling.diskscheduling;
2+
3+
import java.util.ArrayList;
4+
import java.util.Collections;
5+
import java.util.List;
6+
7+
/**
8+
* Circular Scan Scheduling (C-SCAN) is a disk scheduling algorithm that
9+
* works by moving the disk arm in one direction to service requests until
10+
* it reaches the end of the disk. Once it reaches the end, instead of reversing
11+
* direction like in the SCAN algorithm, the arm moves back to the starting point
12+
* without servicing any requests. This ensures a more uniform wait time for all
13+
* requests, especially those near the disk edges. The algorithm then continues in
14+
* the same direction, making it effective for balancing service time across all disk sectors.
15+
*/
16+
public class CircularScanScheduling {
17+
private int currentPosition;
18+
private boolean movingUp;
19+
private final int diskSize;
20+
21+
public CircularScanScheduling(int startPosition, boolean movingUp, int diskSize) {
22+
this.currentPosition = startPosition;
23+
this.movingUp = movingUp;
24+
this.diskSize = diskSize;
25+
}
26+
27+
public List<Integer> execute(List<Integer> requests) {
28+
if (requests.isEmpty()) {
29+
return new ArrayList<>(); // Return empty list if there are no requests
30+
}
31+
32+
List<Integer> sortedRequests = new ArrayList<>(requests);
33+
Collections.sort(sortedRequests);
34+
35+
List<Integer> result = new ArrayList<>();
36+
37+
if (movingUp) {
38+
// Moving up: process requests >= current position
39+
for (int request : sortedRequests) {
40+
if (request >= currentPosition && request < diskSize) {
41+
result.add(request);
42+
}
43+
}
44+
45+
// Jump to the smallest request and continue processing from the start
46+
for (int request : sortedRequests) {
47+
if (request < currentPosition) {
48+
result.add(request);
49+
}
50+
}
51+
} else {
52+
// Moving down: process requests <= current position in reverse order
53+
for (int i = sortedRequests.size() - 1; i >= 0; i--) {
54+
int request = sortedRequests.get(i);
55+
if (request <= currentPosition) {
56+
result.add(request);
57+
}
58+
}
59+
60+
// Jump to the largest request and continue processing in reverse order
61+
for (int i = sortedRequests.size() - 1; i >= 0; i--) {
62+
int request = sortedRequests.get(i);
63+
if (request > currentPosition) {
64+
result.add(request);
65+
}
66+
}
67+
}
68+
69+
// Set final position to the last request processed
70+
if (!result.isEmpty()) {
71+
currentPosition = result.get(result.size() - 1);
72+
}
73+
return result;
74+
}
75+
76+
public int getCurrentPosition() {
77+
return currentPosition;
78+
}
79+
80+
public boolean isMovingUp() {
81+
return movingUp;
82+
}
83+
}

0 commit comments

Comments
 (0)