From 2be3aa5c14250c0adec268882ad8d855a047d4fd Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Wed, 9 Oct 2024 12:23:06 +0530 Subject: [PATCH 1/5] Add tests, remove `main` in `LinearSearchThread` --- .../searches/LinearSearchThread.java | 83 ++++++++++--------- .../searches/LinearSearchThreadTest.java | 74 +++++++++++++++++ 2 files changed, 117 insertions(+), 40 deletions(-) create mode 100644 src/test/java/com/thealgorithms/searches/LinearSearchThreadTest.java diff --git a/src/main/java/com/thealgorithms/searches/LinearSearchThread.java b/src/main/java/com/thealgorithms/searches/LinearSearchThread.java index b354d312d1b3..ba3cff915f5f 100644 --- a/src/main/java/com/thealgorithms/searches/LinearSearchThread.java +++ b/src/main/java/com/thealgorithms/searches/LinearSearchThread.java @@ -1,52 +1,47 @@ package com.thealgorithms.searches; -import java.util.Scanner; - +/** + * LinearSearchThread is a multithreaded implementation of the linear search algorithm. + * It creates multiple threads to search for a specific number in an array. + * + *

+ * The class generates an array of random integers, prompts the user to enter a number to search for, + * and divides the array into four segments, each handled by a separate thread. + * The threads run concurrently and search for the specified number within their designated segments. + * Finally, it consolidates the results to determine if the number was found. + *

+ * + *

+ * Example usage: + * 1. The program will output the generated array. + * 2. The user will be prompted to input a number to search for. + * 3. The program will display whether the number was found in the array. + *

+ */ public final class LinearSearchThread { private LinearSearchThread() { } - - public static void main(String[] args) { - int[] list = new int[200]; - for (int j = 0; j < list.length; j++) { - list[j] = (int) (Math.random() * 100); - } - for (int y : list) { - System.out.print(y + " "); - } - System.out.println(); - System.out.print("Enter number to search for: "); - Scanner in = new Scanner(System.in); - int x = in.nextInt(); - Searcher t = new Searcher(list, 0, 50, x); - Searcher t1 = new Searcher(list, 50, 100, x); - Searcher t2 = new Searcher(list, 100, 150, x); - Searcher t3 = new Searcher(list, 150, 200, x); - t.start(); - t1.start(); - t2.start(); - t3.start(); - try { - t.join(); - t1.join(); - t2.join(); - t3.join(); - } catch (InterruptedException e) { - } - boolean found = t.getResult() || t1.getResult() || t2.getResult() || t3.getResult(); - System.out.println("Found = " + found); - in.close(); - } } +/** + * The Searcher class extends Thread and is responsible for searching for a specific + * number in a segment of an array. + */ class Searcher extends Thread { + private final int[] arr; // The array to search in + private final int left; // Starting index of the segment + private final int right; // Ending index of the segment + private final int x; // The number to search for + private boolean found; // Result flag - private final int[] arr; - private final int left; - private final int right; - private final int x; - private boolean found; - + /** + * Constructor to initialize the Searcher. + * + * @param arr The array to search in + * @param left The starting index of the segment + * @param right The ending index of the segment + * @param x The number to search for + */ Searcher(int[] arr, int left, int right, int x) { this.arr = arr; this.left = left; @@ -54,6 +49,9 @@ class Searcher extends Thread { this.x = x; } + /** + * The run method for the thread, performing the linear search in its segment. + */ @Override public void run() { int k = left; @@ -65,6 +63,11 @@ public void run() { } } + /** + * Returns whether the number was found in the segment. + * + * @return true if the number was found, false otherwise + */ boolean getResult() { return found; } diff --git a/src/test/java/com/thealgorithms/searches/LinearSearchThreadTest.java b/src/test/java/com/thealgorithms/searches/LinearSearchThreadTest.java new file mode 100644 index 000000000000..3a05b2360337 --- /dev/null +++ b/src/test/java/com/thealgorithms/searches/LinearSearchThreadTest.java @@ -0,0 +1,74 @@ +package com.thealgorithms.searches; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +class LinearSearchThreadTest { + + /** + * Test for finding an element that is present in the array. + */ + @Test + void testSearcherFound() throws InterruptedException { + int[] array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + Searcher searcher = new Searcher(array, 0, array.length, 5); + searcher.start(); + searcher.join(); + assertTrue(searcher.getResult(), "The element 5 should be found in the array."); + } + + /** + * Test for finding an element that is not present in the array. + */ + @Test + void testSearcherNotFound() throws InterruptedException { + int[] array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + Searcher searcher = new Searcher(array, 0, array.length, 11); + searcher.start(); + searcher.join(); + assertFalse(searcher.getResult(), "The element 11 should not be found in the array."); + } + + /** + * Test for searching a segment of the array. + */ + @Test + void testSearcherSegmentFound() throws InterruptedException { + int[] array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + Searcher searcher = new Searcher(array, 0, 5, 3); // Search in the first half + searcher.start(); + searcher.join(); + assertTrue(searcher.getResult(), "The element 3 should be found in the segment."); + } + + /** + * Test for searching an empty array segment. + */ + @Test + void testSearcherEmptySegment() throws InterruptedException { + int[] array = {}; + Searcher searcher = new Searcher(array, 0, 0, 1); // Empty array + searcher.start(); + searcher.join(); + assertFalse(searcher.getResult(), "The element should not be found in an empty segment."); + } + + /** + * Test for searching with random numbers. + */ + @Test + void testSearcherRandomNumbers() throws InterruptedException { + int size = 200; + int[] array = new int[size]; + for (int i = 0; i < size; i++) { + array[i] = (int) (Math.random() * 100); // Fill array with random integers + } + int target = array[(int) (Math.random() * size)]; // Randomly select a target that is present + Searcher searcher = new Searcher(array, 0, size, target); + searcher.start(); + searcher.join(); + assertTrue(searcher.getResult(), "The randomly selected target should be found in the array."); + } +} From 49a8a78fe6fa91f6fae23672fefa4c2675b14be2 Mon Sep 17 00:00:00 2001 From: Hardvan Date: Wed, 9 Oct 2024 06:53:25 +0000 Subject: [PATCH 2/5] Update directory --- DIRECTORY.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index 6042dd1b5e0d..60b9cabdc2a6 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -31,6 +31,7 @@ * [IsPowerTwo](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/bitmanipulation/IsPowerTwo.java) * [LowestSetBit](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/bitmanipulation/LowestSetBit.java) * [NonRepeatingNumberFinder](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/bitmanipulation/NonRepeatingNumberFinder.java) + * [NumberAppearingOddTimes](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/bitmanipulation/NumberAppearingOddTimes.java) * [NumbersDifferentSigns](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/bitmanipulation/NumbersDifferentSigns.java) * [ReverseBits](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/bitmanipulation/ReverseBits.java) * [SingleBitOperations](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/bitmanipulation/SingleBitOperations.java) @@ -638,6 +639,7 @@ * [IsPowerTwoTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/bitmanipulation/IsPowerTwoTest.java) * [LowestSetBitTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/bitmanipulation/LowestSetBitTest.java) * [NonRepeatingNumberFinderTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/bitmanipulation/NonRepeatingNumberFinderTest.java) + * [NumberAppearingOddTimesTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/bitmanipulation/NumberAppearingOddTimesTest.java) * [NumbersDifferentSignsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/bitmanipulation/NumbersDifferentSignsTest.java) * [ReverseBitsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/bitmanipulation/ReverseBitsTest.java) * [SingleBitOperationsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/bitmanipulation/SingleBitOperationsTest.java) @@ -970,6 +972,7 @@ * [DepthFirstSearchTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/DepthFirstSearchTest.java) * [HowManyTimesRotatedTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/HowManyTimesRotatedTest.java) * [KMPSearchTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/KMPSearchTest.java) + * [LinearSearchThreadTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/LinearSearchThreadTest.java) * [OrderAgnosticBinarySearchTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/OrderAgnosticBinarySearchTest.java) * [PerfectBinarySearchTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/PerfectBinarySearchTest.java) * [QuickSelectTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/QuickSelectTest.java) From d774b45ac2c9278248502afa629326a383556b40 Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Wed, 9 Oct 2024 12:45:09 +0530 Subject: [PATCH 3/5] Fix --- .../java/com/thealgorithms/searches/LinearSearchThreadTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/thealgorithms/searches/LinearSearchThreadTest.java b/src/test/java/com/thealgorithms/searches/LinearSearchThreadTest.java index 3a05b2360337..68b9a45a73bd 100644 --- a/src/test/java/com/thealgorithms/searches/LinearSearchThreadTest.java +++ b/src/test/java/com/thealgorithms/searches/LinearSearchThreadTest.java @@ -37,7 +37,7 @@ void testSearcherNotFound() throws InterruptedException { @Test void testSearcherSegmentFound() throws InterruptedException { int[] array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; - Searcher searcher = new Searcher(array, 0, 5, 3); // Search in the first half + Searcher searcher = new Searcher(array, 0, 5, 3); searcher.start(); searcher.join(); assertTrue(searcher.getResult(), "The element 3 should be found in the segment."); From e8f324663d5c3def032c0340967c678ddae17b15 Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Wed, 9 Oct 2024 12:49:46 +0530 Subject: [PATCH 4/5] Fix --- .../java/com/thealgorithms/searches/LinearSearchThreadTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/thealgorithms/searches/LinearSearchThreadTest.java b/src/test/java/com/thealgorithms/searches/LinearSearchThreadTest.java index 68b9a45a73bd..534c2a4487b2 100644 --- a/src/test/java/com/thealgorithms/searches/LinearSearchThreadTest.java +++ b/src/test/java/com/thealgorithms/searches/LinearSearchThreadTest.java @@ -63,7 +63,7 @@ void testSearcherRandomNumbers() throws InterruptedException { int size = 200; int[] array = new int[size]; for (int i = 0; i < size; i++) { - array[i] = (int) (Math.random() * 100); // Fill array with random integers + array[i] = (int) (Math.random() * 100); } int target = array[(int) (Math.random() * size)]; // Randomly select a target that is present Searcher searcher = new Searcher(array, 0, size, target); From 2c6c5b8bbd495a6e78a11b5df8fbb8a384c2d92f Mon Sep 17 00:00:00 2001 From: siriak Date: Thu, 10 Oct 2024 20:25:29 +0000 Subject: [PATCH 5/5] Update directory --- DIRECTORY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DIRECTORY.md b/DIRECTORY.md index 44e0a3c97ffb..f0c4486eebe6 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -1009,8 +1009,8 @@ * [IterativeTernarySearchTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/IterativeTernarySearchTest.java) * [JumpSearchTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/JumpSearchTest.java) * [KMPSearchTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/KMPSearchTest.java) - * [LinearSearchThreadTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/LinearSearchThreadTest.java) * [LinearSearchTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/LinearSearchTest.java) + * [LinearSearchThreadTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/LinearSearchThreadTest.java) * [MonteCarloTreeSearchTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/MonteCarloTreeSearchTest.java) * [OrderAgnosticBinarySearchTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/OrderAgnosticBinarySearchTest.java) * [PerfectBinarySearchTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/PerfectBinarySearchTest.java)