diff --git a/Search/ExponentialSearch.js b/Search/ExponentialSearch.js new file mode 100644 index 0000000000..e46a5ee89e --- /dev/null +++ b/Search/ExponentialSearch.js @@ -0,0 +1,58 @@ +/** + * Exponential Search + * + * The algorithm consists of two stages. The first stage determines a + * range in which the search key would reside if it were in the list. + * In the second stage, a binary search is performed on this range. + * + * + * + */ + +function binarySearch (arr, x, floor, ceiling) { + // Middle index + const mid = Math.floor((floor + ceiling) / 2) + + // If value is at the mid position return this position + if (arr[mid] === x) { + return mid + } + + if (floor > ceiling) return -1 + + // If the middle element is great than the value + // search the left part of the array + if (arr[mid] > value) { + return binarySearch(arr, value, floor, mid - 1) + // If the middle element is lower than the value + // search the right part of the array + } else { + return binarySearch(arr, value, mid + 1, ceiling) + } +} + +function exponentialSearch (arr, length, value) { + // If value is the first element of the array return this position + if (arr[0] === value) { + return 0 + } + + // Find range for binary search + let i = 1 + while (i < length && arr[i] <= value) { + i = i * 2 + } + + // Call binary search for the range found above + return binarySearch(arr, value, i / 2, Math.min(i, length)) +} + +const arr = [2, 3, 4, 10, 40, 65, 78, 100] +const value = 78 +const result = exponentialSearch(arr, arr.length, value) + +if (result < 0) { + console.log('Element not found') +} else { + console.log('Element found at position :' + result) +} diff --git a/Search/InterpolationSearch.js b/Search/InterpolationSearch.js new file mode 100644 index 0000000000..c256fd8c7e --- /dev/null +++ b/Search/InterpolationSearch.js @@ -0,0 +1,46 @@ +/** + * Interpolation Search + * + * Time Complexity: + * -Best case: O(1) + * -Worst case: O(n) + * -O((log(log(n))) If the data are uniformly distributed + * + * + */ + +function interpolationSearch (arr, key) { + const length = arr.length - 1 + let low = 0 + let high = length + let position = -1 + let delta = -1 + + // Because the array is sorted the key must be between low and high + while (low <= high && key >= arr[low] && key <= arr[high]) { + delta = (key - arr[low]) / (arr[high] - arr[low]) + position = low + Math.floor((high - low) * delta) + + // Target found return its position + if (arr[position] === key) { + return position + } + + // If the key is larger then it is in the upper part of the array + if (arr[position] < key) { + low = position + 1 + // If the key is smaller then it is in the lower part of the array + } else { + high = position - 1 + } + } + + return -1 +} + +const arr = [2, 6, 8, 10, 12, 14, 16, 18, 20, 22, 26, 34, 39] + +console.log('Found at position :' + interpolationSearch(arr, 2)) +console.log('Found at position :' + interpolationSearch(arr, 12)) +console.log('Found at position :' + interpolationSearch(arr, 1000)) +console.log('Found at position :' + interpolationSearch(arr, 39))
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: