forked from TheAlgorithms/Java
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added a iterative version of ternary search algorithm and some minor …
…changes in documentation
- Loading branch information
1 parent
066adc7
commit c002090
Showing
2 changed files
with
77 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
package search; | ||
|
||
import java.util.Arrays; | ||
import java.util.Random; | ||
import java.util.stream.Stream; | ||
|
||
import static java.lang.String.format; | ||
|
||
/** | ||
* | ||
* A iterative version of a ternary search algorithm | ||
* This is better way to implement the ternary search, because a recursive version adds some overhead to a stack. | ||
* But in java the compile can transform the recursive version to iterative implicitly, | ||
* so there are no much differences between these two algorithms | ||
* | ||
* Worst-case performance Θ(log3(N)) | ||
* Best-case performance O(1) | ||
* Average performance Θ(log3(N)) | ||
* Worst-case space complexity O(1) | ||
* | ||
* | ||
* @author Podshivalov Nikita (https://github.com/nikitap492) | ||
* @since 2018-04-13 | ||
* | ||
* @see SearchAlgorithm | ||
* @see TernarySearch | ||
* | ||
*/ | ||
|
||
public class IterativeTernarySearch implements SearchAlgorithm { | ||
|
||
|
||
@Override | ||
public <T extends Comparable<T>> int find(T[] array, T key) { | ||
int left = 0; | ||
int right = array.length - 1; | ||
while (true) { | ||
int leftCmp = array[left].compareTo(key); | ||
int rightCmp = array[right].compareTo(key); | ||
if (leftCmp == 0) return left; | ||
if (rightCmp == 0) return right; | ||
|
||
int leftThird = left + (right - left) / 3; | ||
int rightThird = right - (right - left) /3; | ||
|
||
if (array[leftThird].compareTo(key) <= 0) left = leftThird; | ||
else right = rightThird; | ||
} | ||
|
||
} | ||
|
||
|
||
public static void main(String[] args) { | ||
//just generate data | ||
Random r = new Random(); | ||
int size = 100; | ||
int maxElement = 100000; | ||
Integer[] integers = Stream.generate(() -> r.nextInt(maxElement)).limit(size).sorted().toArray(Integer[]::new); | ||
|
||
|
||
//the element that should be found | ||
Integer shouldBeFound = integers[r.nextInt(size - 1)]; | ||
|
||
IterativeTernarySearch search = new IterativeTernarySearch(); | ||
int atIndex = search.find(integers, shouldBeFound); | ||
|
||
System.out.println(format("Should be found: %d. Found %d at index %d. An array length %d" | ||
, shouldBeFound, integers[atIndex], atIndex, size)); | ||
|
||
int toCheck = Arrays.binarySearch(integers, shouldBeFound); | ||
System.out.println(format("Found by system method at an index: %d. Is equal: %b", toCheck, toCheck == atIndex)); | ||
|
||
} | ||
|
||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters