From beccf294b3825e25a3a10ceac02be766689282b6 Mon Sep 17 00:00:00 2001 From: ayDavidGitHere Date: Tue, 1 Nov 2022 04:06:32 +0100 Subject: [PATCH] update ExponentialSearch and added TernarySearch Added ExponentialSearch and TernarySearch to Test/Searches and updated Directory.md --- Searches/ExponentialSearch.php | 45 ++---------------- Searches/TernarySearch.php | 83 ++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 42 deletions(-) create mode 100644 Searches/TernarySearch.php diff --git a/Searches/ExponentialSearch.php b/Searches/ExponentialSearch.php index 7763a9e..7073053 100644 --- a/Searches/ExponentialSearch.php +++ b/Searches/ExponentialSearch.php @@ -7,14 +7,6 @@ **** if it were in the list. * In the second stage, a binary search is performed on this range. */ - - - - - - - - /** * @param Array $arr * @param int $value @@ -25,18 +17,12 @@ function binarySearch ($arr, $value, $floor, $ceiling) { // Get $middle index $mid = floor(($floor + $ceiling) / 2); - // Return position if $value is at the $mid position if ($arr[$mid] === $value) { return (int) $mid; } - //Return -1 is range is wrong if ($floor > $ceiling) return -1; - - - - // search the left part of the $array // If the $middle element is great than the $value if ($arr[$mid] > $value) { @@ -48,22 +34,13 @@ function binarySearch ($arr, $value, $floor, $ceiling) { return binarySearch($arr, $value, $mid + 1, $ceiling); } } - - - - - - - - - /** * @param Array $arr * @param int $length * @param int $value * @return int **/ -function exponentialSearch ($arr, $length, $value) { +function exponentialSearch ($arr, $value) { // If $value is the first element of the $array return this position if ($arr[0] === $value) { return 0; @@ -71,6 +48,7 @@ function exponentialSearch ($arr, $length, $value) { // Find range for binary search $i = 1; + $length = count($arr); while ($i < $length && $arr[$i] <= $value) { $i = $i * 2; } @@ -79,21 +57,4 @@ function exponentialSearch ($arr, $length, $value) { // Call binary search for the range found above return binarySearch($arr, $value, $floor, $ceiling); -} - - - - - - - - - -function Test(){ - $arr = [2, 3, 4, 7, 28, 35, 63, 98]; - $value = 35; - $result = exponentialSearch($arr, count($arr), $value); - - var_dump($result); -} -//Test(); \ No newline at end of file +} \ No newline at end of file diff --git a/Searches/TernarySearch.php b/Searches/TernarySearch.php new file mode 100644 index 0000000..cd12fa2 --- /dev/null +++ b/Searches/TernarySearch.php @@ -0,0 +1,83 @@ + $arr[$mid2]) { + // the $key lies in between $mid2 and $high + return ternarySearchByRecursion($arr, $key, $mid2 + 1, $high); + } else { + // the $key lies in between $mid1 and $mid2 + return ternarySearchByRecursion($arr, $key, $mid1 + 1, $mid2 - 1); + } +} + +function ternarySearchIterative ($arr, $key) { + $low = 0; $high = count($arr) - 1; + while ($high >= $low) { + // find the $mid1 and $mid2 + $mid1 = floor($low + ($high - $low) / 3); + $mid2 = floor($high - ($high - $low) / 3); + + // check if $key is found at any $mid + if ($arr[$mid1] === $key) { + // return index of $key if found + return $mid1; + } + if ($arr[$mid2] === $key) { + // return index of $key if found + return $mid2; + } + + // since the $key is not found at $mid, + // check in which region it is present + // and repeat the Search operation + // in that region + if ($key < $arr[$mid1]) { + // the $key lies in between $low and $mid1 + $high = $mid1 - 1; + } else if ($key > $arr[$mid2]) { + // the $key lies in between $mid2 and $high + $low = $mid2 + 1; + } else { + // the $key lies in between $mid1 and $mid2 + $low = $mid1 + 1; + $high = $mid2 - 1; + } + } + // the $key was not found + return -1; +} \ No newline at end of file