Skip to content

Commit 1818763

Browse files
HardvanChiefpatwal
authored andcommitted
feat: Add RandomSearch new algorithm with Junit tests (TheAlgorithms#5701)
1 parent c2e92a1 commit 1818763

File tree

3 files changed

+141
-1
lines changed

3 files changed

+141
-1
lines changed

DIRECTORY.md

+9-1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
* [Caesar](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/ciphers/Caesar.java)
5757
* [ColumnarTranspositionCipher](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/ciphers/ColumnarTranspositionCipher.java)
5858
* [DES](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/ciphers/DES.java)
59+
* [ECC](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/ciphers/ECC.java)
5960
* [HillCipher](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/ciphers/HillCipher.java)
6061
* [PlayfairCipher](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/ciphers/PlayfairCipher.java)
6162
* [Polybius](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/ciphers/Polybius.java)
@@ -275,6 +276,7 @@
275276
* [ShortestCommonSupersequenceLength](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/dynamicprogramming/ShortestCommonSupersequenceLength.java)
276277
* [SubsetCount](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/dynamicprogramming/SubsetCount.java)
277278
* [SubsetSum](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/dynamicprogramming/SubsetSum.java)
279+
* [SubsetSumSpaceOptimized](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/dynamicprogramming/SubsetSumSpaceOptimized.java)
278280
* [SumOfSubset](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/dynamicprogramming/SumOfSubset.java)
279281
* [Tribonacci](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/dynamicprogramming/Tribonacci.java)
280282
* [UniquePaths](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/dynamicprogramming/UniquePaths.java)
@@ -396,6 +398,7 @@
396398
* [SecondMinMax](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/SecondMinMax.java)
397399
* [SieveOfEratosthenes](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/SieveOfEratosthenes.java)
398400
* [SimpsonIntegration](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/SimpsonIntegration.java)
401+
* [SolovayStrassenPrimalityTest](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/SolovayStrassenPrimalityTest.java)
399402
* [SquareFreeInteger](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/SquareFreeInteger.java)
400403
* [SquareRootWithBabylonianMethod](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/SquareRootWithBabylonianMethod.java)
401404
* [SquareRootWithNewtonRaphsonMethod](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/SquareRootWithNewtonRaphsonMethod.java)
@@ -511,6 +514,7 @@
511514
* [PerfectBinarySearch](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/searches/PerfectBinarySearch.java)
512515
* [QuickSelect](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/searches/QuickSelect.java)
513516
* [RabinKarpAlgorithm](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/searches/RabinKarpAlgorithm.java)
517+
* [RandomSearch](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/searches/RandomSearch.java)
514518
* [RecursiveBinarySearch](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/searches/RecursiveBinarySearch.java)
515519
* [RowColumnWiseSorted2dArrayBinarySearch](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/searches/RowColumnWiseSorted2dArrayBinarySearch.java)
516520
* [SaddlebackSearch](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/searches/SaddlebackSearch.java)
@@ -664,12 +668,13 @@
664668
* [LFSRTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/ciphers/a5/LFSRTest.java)
665669
* [AESEncryptionTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/ciphers/AESEncryptionTest.java)
666670
* [AffineCipherTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/ciphers/AffineCipherTest.java)
667-
* [AtbashTest](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/ciphers/AtbashTest.java)
671+
* [AtbashTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/ciphers/AtbashTest.java)
668672
* [AutokeyTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/ciphers/AutokeyTest.java)
669673
* [BlowfishTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/ciphers/BlowfishTest.java)
670674
* [CaesarTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/ciphers/CaesarTest.java)
671675
* [ColumnarTranspositionCipherTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/ciphers/ColumnarTranspositionCipherTest.java)
672676
* [DESTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/ciphers/DESTest.java)
677+
* [ECCTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/ciphers/ECCTest.java)
673678
* [HillCipherTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/ciphers/HillCipherTest.java)
674679
* [PlayfairTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/ciphers/PlayfairTest.java)
675680
* [PolybiusTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/ciphers/PolybiusTest.java)
@@ -829,6 +834,7 @@
829834
* [RodCuttingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/RodCuttingTest.java)
830835
* [ShortestCommonSupersequenceLengthTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/ShortestCommonSupersequenceLengthTest.java)
831836
* [SubsetCountTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/SubsetCountTest.java)
837+
* [SubsetSumSpaceOptimizedTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/SubsetSumSpaceOptimizedTest.java)
832838
* [SubsetSumTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/SubsetSumTest.java)
833839
* [SumOfSubsetTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/SumOfSubsetTest.java)
834840
* [TribonacciTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/TribonacciTest.java)
@@ -935,6 +941,7 @@
935941
* [ReverseNumberTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/ReverseNumberTest.java)
936942
* [SecondMinMaxTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/SecondMinMaxTest.java)
937943
* [SieveOfEratosthenesTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/SieveOfEratosthenesTest.java)
944+
* [SolovayStrassenPrimalityTestTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/SolovayStrassenPrimalityTestTest.java)
938945
* [SquareFreeIntegerTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/SquareFreeIntegerTest.java)
939946
* [SquareRootwithBabylonianMethodTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/SquareRootwithBabylonianMethodTest.java)
940947
* [SquareRootWithNewtonRaphsonTestMethod](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/SquareRootWithNewtonRaphsonTestMethod.java)
@@ -1018,6 +1025,7 @@
10181025
* [PerfectBinarySearchTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/PerfectBinarySearchTest.java)
10191026
* [QuickSelectTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/QuickSelectTest.java)
10201027
* [RabinKarpAlgorithmTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/RabinKarpAlgorithmTest.java)
1028+
* [RandomSearchTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/RandomSearchTest.java)
10211029
* [RecursiveBinarySearchTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/RecursiveBinarySearchTest.java)
10221030
* [RowColumnWiseSorted2dArrayBinarySearchTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/RowColumnWiseSorted2dArrayBinarySearchTest.java)
10231031
* [SaddlebackSearchTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/SaddlebackSearchTest.java)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.thealgorithms.searches;
2+
3+
import com.thealgorithms.devutils.searches.SearchAlgorithm;
4+
import java.util.HashSet;
5+
import java.util.Random;
6+
import java.util.Set;
7+
8+
/**
9+
* A Random Search algorithm that randomly selects an index and checks if the
10+
* value at that index matches the target. It repeats the process until it
11+
* finds the target or checks all elements.
12+
*
13+
* <p>
14+
* Time Complexity: O(n) in the worst case.
15+
* </p>
16+
*
17+
* @author Hardvan
18+
*/
19+
public class RandomSearch implements SearchAlgorithm {
20+
21+
private final Random random = new Random();
22+
23+
/**
24+
* Finds the index of a given element using random search.
25+
*
26+
* @param array Array to search through
27+
* @param key Element to search for
28+
* @return Index of the element if found, -1 otherwise
29+
*/
30+
@Override
31+
public <T extends Comparable<T>> int find(T[] array, T key) {
32+
Set<Integer> visitedIndices = new HashSet<>();
33+
int size = array.length;
34+
35+
while (visitedIndices.size() < size) {
36+
int randomIndex = random.nextInt(size);
37+
if (array[randomIndex].compareTo(key) == 0) {
38+
return randomIndex;
39+
}
40+
visitedIndices.add(randomIndex);
41+
}
42+
43+
return -1;
44+
}
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package com.thealgorithms.searches;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertNotEquals;
5+
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.Test;
8+
9+
class RandomSearchTest {
10+
11+
private RandomSearch randomSearch;
12+
13+
@BeforeEach
14+
void setUp() {
15+
randomSearch = new RandomSearch();
16+
}
17+
18+
@Test
19+
void testElementFound() {
20+
Integer[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
21+
Integer key = 5;
22+
int index = randomSearch.find(array, key);
23+
24+
assertNotEquals(-1, index, "Element should be found in the array.");
25+
assertEquals(key, array[index], "Element found should match the key.");
26+
}
27+
28+
@Test
29+
void testElementNotFound() {
30+
Integer[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
31+
Integer key = 11;
32+
int index = randomSearch.find(array, key);
33+
34+
assertEquals(-1, index, "Element not present in the array should return -1.");
35+
}
36+
37+
@Test
38+
void testEmptyArray() {
39+
Integer[] emptyArray = {};
40+
Integer key = 5;
41+
int index = randomSearch.find(emptyArray, key);
42+
43+
assertEquals(-1, index, "Searching in an empty array should return -1.");
44+
}
45+
46+
@Test
47+
void testSingleElementArrayFound() {
48+
Integer[] array = {5};
49+
Integer key = 5;
50+
int index = randomSearch.find(array, key);
51+
52+
assertEquals(0, index, "The key should be found at index 0 in a single-element array.");
53+
}
54+
55+
@Test
56+
void testSingleElementArrayNotFound() {
57+
Integer[] array = {1};
58+
Integer key = 5;
59+
int index = randomSearch.find(array, key);
60+
61+
assertEquals(-1, index, "The key should not be found in a single-element array if it does not match.");
62+
}
63+
64+
@Test
65+
void testDuplicateElementsFound() {
66+
Integer[] array = {1, 2, 3, 4, 5, 5, 5, 7, 8, 9, 10};
67+
Integer key = 5;
68+
int index = randomSearch.find(array, key);
69+
70+
assertNotEquals(-1, index, "The key should be found in the array with duplicates.");
71+
assertEquals(key, array[index], "The key found should be 5.");
72+
}
73+
74+
@Test
75+
void testLargeArray() {
76+
Integer[] largeArray = new Integer[1000];
77+
for (int i = 0; i < largeArray.length; i++) {
78+
largeArray[i] = i + 1; // Fill with values 1 to 1000
79+
}
80+
81+
Integer key = 500;
82+
int index = randomSearch.find(largeArray, key);
83+
84+
assertNotEquals(-1, index, "The key should be found in the large array.");
85+
assertEquals(key, largeArray[index], "The key found should match 500.");
86+
}
87+
}

0 commit comments

Comments
 (0)