From 4d8d0b88e5d218d272883296373b9820af4cd2ea Mon Sep 17 00:00:00 2001 From: Kyle-Ski Date: Fri, 11 Oct 2019 18:16:02 -0600 Subject: [PATCH 1/4] implamenting ternary search --- .../TernarySearch/TernarySearch.test.js | 41 ++++++++++++++ src/_Searching_/TernarySearch/index.js | 53 +++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 src/_Searching_/TernarySearch/TernarySearch.test.js create mode 100644 src/_Searching_/TernarySearch/index.js diff --git a/src/_Searching_/TernarySearch/TernarySearch.test.js b/src/_Searching_/TernarySearch/TernarySearch.test.js new file mode 100644 index 00000000..8057f612 --- /dev/null +++ b/src/_Searching_/TernarySearch/TernarySearch.test.js @@ -0,0 +1,41 @@ +const { ternarySearch, ternarySearchRecursive } = require('.'); + +describe('Ternary Search', () => { + const array = [1, 2, 3, 4, 5, 6, 7, 8]; + const low = 0; + const high = array.length - 1; + + describe('When element to find is at 1st position ', () => { + it('Ternary search with Loop', () => { + expect(ternarySearch(array, 1)).toEqual(0); + }); + it('Ternary serach with recursion', () => { + expect(ternarySearchRecursive(array, low, high, 1)).toEqual(0); + }); + }); + describe('When element to find is at last position ', () => { + it('Ternary search with Loop', () => { + expect(ternarySearch(array, 7)).toEqual(6); + }); + it('Ternary serach with recursion', () => { + expect(ternarySearchRecursive(array, low, high, 7)).toEqual(6); + }); + }); + describe('When element to find is at random position ', () => { + it('Ternary search with Loop', () => { + expect(ternarySearch(array, 3)).toEqual(2); + }); + it('Ternary serach with recursion', () => { + expect(ternarySearchRecursive(array, low, high, 3)).toEqual(2); + }); + }); + describe('When element to find is no present in array ', () => { + it('Ternary search with Loop', () => { + expect(ternarySearch(array, 10)).toEqual(null); + }); + it('Ternary serach with recursion', () => { + expect(ternarySearchRecursive(array, low, high, 10)).toEqual(null); + }); + }); + +}); diff --git a/src/_Searching_/TernarySearch/index.js b/src/_Searching_/TernarySearch/index.js new file mode 100644 index 00000000..8f0421bd --- /dev/null +++ b/src/_Searching_/TernarySearch/index.js @@ -0,0 +1,53 @@ +/** + * Note: Array must be sorted for binary search + */ +function ternarySearch(arr, key){ + let left = 0; + let right = arr.length - 1; + while(left <= right){ + let temp2 = left + Math.floor((right - left) / 3); + let temp3 = left + 2 * Math.floor((right - left) / 3); + if(key == arr[left]){ + return left; + } else if(key == arr[right]){ + return right; + } else if(key < arr[left] || key > arr[right]){ + return null; + } else if(key <= arr[temp2]){ + right = temp2; + } else if(key > arr[temp2] && key <= arr[temp3]){ + left = temp2 + 1; + right = temp3; + } else { + left = temp3 + 1; + } + } + return null; +} + +function ternarySearchRecursive(arr, low, high, key){ + + if(high >= low){ + let highMiddle = low + 2 * Math.floor((high - low) / 3); + let lowMiddle = low + Math.floor((high - low) / 3); + if(key === arr[lowMiddle]){ + return lowMiddle; + } else if(key === arr[highMiddle]){ + return highMiddle; + } else if(key < arr[highMiddle]){ + return ternarySearchRecursive(arr, low, lowMiddle, key); + } else if(key > arr[lowMiddle] && key < arr[highMiddle]){ + return ternarySearchRecursive(arr, lowMiddle, highMiddle, key); + } else if(arr.indexOf(key) == - 1){ + return null; + } else { + return ternarySearchRecursive(arr, highMiddle, high, key); + } + } + return null; +} + +module.exports = { + ternarySearch, + ternarySearchRecursive +}; From dedde4035e0f601959a47b25e57b7755ef21c90c Mon Sep 17 00:00:00 2001 From: Kyle-Ski Date: Fri, 11 Oct 2019 18:22:00 -0600 Subject: [PATCH 2/4] adding complexity --- src/_Searching_/TernarySearch/index.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/_Searching_/TernarySearch/index.js b/src/_Searching_/TernarySearch/index.js index 8f0421bd..8bd1df72 100644 --- a/src/_Searching_/TernarySearch/index.js +++ b/src/_Searching_/TernarySearch/index.js @@ -1,6 +1,11 @@ /** * Note: Array must be sorted for binary search - */ + * Complexity: + * Worst case time complexity: O(log N) + * Average case time complexity: O(log N) + * Best case time complexity: O(1) + * Space complexity: O(1) +*/ function ternarySearch(arr, key){ let left = 0; let right = arr.length - 1; From 93f5bf300f4fe07f7a4b4038669f13fbb1f31e38 Mon Sep 17 00:00:00 2001 From: Kyle-Ski Date: Tue, 15 Oct 2019 13:13:52 -0600 Subject: [PATCH 3/4] changed `ternarySearch` to be more like recursive, fixed recursive, tests now correct --- .../TernarySearch/TernarySearch.test.js | 4 +- src/_Searching_/TernarySearch/index.js | 49 +++++++++---------- 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/src/_Searching_/TernarySearch/TernarySearch.test.js b/src/_Searching_/TernarySearch/TernarySearch.test.js index 8057f612..09fbc5f4 100644 --- a/src/_Searching_/TernarySearch/TernarySearch.test.js +++ b/src/_Searching_/TernarySearch/TernarySearch.test.js @@ -15,10 +15,10 @@ describe('Ternary Search', () => { }); describe('When element to find is at last position ', () => { it('Ternary search with Loop', () => { - expect(ternarySearch(array, 7)).toEqual(6); + expect(ternarySearch(array, 8)).toEqual(7); }); it('Ternary serach with recursion', () => { - expect(ternarySearchRecursive(array, low, high, 7)).toEqual(6); + expect(ternarySearchRecursive(array, low, high, 8)).toEqual(7); }); }); describe('When element to find is at random position ', () => { diff --git a/src/_Searching_/TernarySearch/index.js b/src/_Searching_/TernarySearch/index.js index 8bd1df72..ff8e7b14 100644 --- a/src/_Searching_/TernarySearch/index.js +++ b/src/_Searching_/TernarySearch/index.js @@ -1,5 +1,5 @@ /** - * Note: Array must be sorted for binary search + * Note: Array must be sorted for ternary search * Complexity: * Worst case time complexity: O(log N) * Average case time complexity: O(log N) @@ -7,46 +7,43 @@ * Space complexity: O(1) */ function ternarySearch(arr, key){ - let left = 0; - let right = arr.length - 1; - while(left <= right){ - let temp2 = left + Math.floor((right - left) / 3); - let temp3 = left + 2 * Math.floor((right - left) / 3); - if(key == arr[left]){ - return left; - } else if(key == arr[right]){ - return right; - } else if(key < arr[left] || key > arr[right]){ - return null; - } else if(key <= arr[temp2]){ - right = temp2; - } else if(key > arr[temp2] && key <= arr[temp3]){ - left = temp2 + 1; - right = temp3; + let low = 0; + let high = arr.length - 1; + while(low <= high){ + let lowMiddle = low + Math.floor((high - low) / 3); + let highMiddle = low + 2 * Math.floor((high - low) / 3); + if(key == arr[low]){ + return low; + } else if(key == arr[high]){ + return high; + } else if(key <= arr[lowMiddle]){ + high = lowMiddle; + } else if(key > arr[lowMiddle] && key <= arr[highMiddle]){ + low = lowMiddle + 1; + high = highMiddle; } else { - left = temp3 + 1; + low = highMiddle + 1; } } return null; } function ternarySearchRecursive(arr, low, high, key){ - - if(high >= low){ + if(high > low){ let highMiddle = low + 2 * Math.floor((high - low) / 3); let lowMiddle = low + Math.floor((high - low) / 3); if(key === arr[lowMiddle]){ return lowMiddle; } else if(key === arr[highMiddle]){ return highMiddle; - } else if(key < arr[highMiddle]){ - return ternarySearchRecursive(arr, low, lowMiddle, key); + } else if(key === arr[high]){ + return high; + } else if(key < arr[lowMiddle]){ + return ternarySearchRecursive(arr, low, lowMiddle - 1, key); } else if(key > arr[lowMiddle] && key < arr[highMiddle]){ - return ternarySearchRecursive(arr, lowMiddle, highMiddle, key); - } else if(arr.indexOf(key) == - 1){ - return null; + return ternarySearchRecursive(arr, lowMiddle + 1, highMiddle - 1, key); } else { - return ternarySearchRecursive(arr, highMiddle, high, key); + return ternarySearchRecursive(arr, highMiddle + 1, high, key); } } return null; From 760a68f09c85ae8df7d5587f70d30f68ead246df Mon Sep 17 00:00:00 2001 From: Kyle-Ski Date: Wed, 16 Oct 2019 09:00:29 -0600 Subject: [PATCH 4/4] fixing recursive search, removing unnecessary if --- src/_Searching_/TernarySearch/TernarySearch.test.js | 2 +- src/_Searching_/TernarySearch/index.js | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/_Searching_/TernarySearch/TernarySearch.test.js b/src/_Searching_/TernarySearch/TernarySearch.test.js index 09fbc5f4..cc72b71c 100644 --- a/src/_Searching_/TernarySearch/TernarySearch.test.js +++ b/src/_Searching_/TernarySearch/TernarySearch.test.js @@ -26,7 +26,7 @@ describe('Ternary Search', () => { expect(ternarySearch(array, 3)).toEqual(2); }); it('Ternary serach with recursion', () => { - expect(ternarySearchRecursive(array, low, high, 3)).toEqual(2); + expect(ternarySearchRecursive(array, low, high, 4)).toEqual(3); }); }); describe('When element to find is no present in array ', () => { diff --git a/src/_Searching_/TernarySearch/index.js b/src/_Searching_/TernarySearch/index.js index ff8e7b14..81a33ff1 100644 --- a/src/_Searching_/TernarySearch/index.js +++ b/src/_Searching_/TernarySearch/index.js @@ -29,15 +29,13 @@ function ternarySearch(arr, key){ } function ternarySearchRecursive(arr, low, high, key){ - if(high > low){ + if(high >= low){ let highMiddle = low + 2 * Math.floor((high - low) / 3); let lowMiddle = low + Math.floor((high - low) / 3); if(key === arr[lowMiddle]){ return lowMiddle; } else if(key === arr[highMiddle]){ return highMiddle; - } else if(key === arr[high]){ - return high; } else if(key < arr[lowMiddle]){ return ternarySearchRecursive(arr, low, lowMiddle - 1, key); } else if(key > arr[lowMiddle] && key < arr[highMiddle]){