93 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			93 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								title: Exponential Search
							 | 
						||
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Exponential Search
							 | 
						||
| 
								 | 
							
								Exponential Search also known as finger search, searchs for an element in a sorted array by jumping `2^i` elements every iteration where i represents the 
							 | 
						||
| 
								 | 
							
								value of loop control variable, and then verifying if the search element is present between last jump and the current jump
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Complexity Worst Case
							 | 
						||
| 
								 | 
							
								O(log(N))
							 | 
						||
| 
								 | 
							
								Often confused because of the name, the algorithm is named so not because of the time complexity.
							 | 
						||
| 
								 | 
							
								The name arises as a result of the algorithm jumping elements with steps equal to exponents of 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Works
							 | 
						||
| 
								 | 
							
								1. Jump the array `2^i` elements at a time searching for the condition `Array[2^(i-1)] < valueWanted < Array[2^i]`. If `2^i` is greater than the lenght of array, then set the upper bound to the length of the array.
							 | 
						||
| 
								 | 
							
								2. Do a binary search between `Array[2^(i-1)]` and `Array[2^i]`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Code 
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								// C++ program to find an element x in a
							 | 
						||
| 
								 | 
							
								// sorted array using Exponential search.
							 | 
						||
| 
								 | 
							
								#include <bits/stdc++.h>
							 | 
						||
| 
								 | 
							
								using namespace std;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								int binarySearch(int arr[], int, int, int);
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								// Returns position of first ocurrence of
							 | 
						||
| 
								 | 
							
								// x in array
							 | 
						||
| 
								 | 
							
								int exponentialSearch(int arr[], int n, int x)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    // If x is present at firt location itself
							 | 
						||
| 
								 | 
							
								    if (arr[0] == x)
							 | 
						||
| 
								 | 
							
								        return 0;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								    // Find range for binary search by
							 | 
						||
| 
								 | 
							
								    // repeated doubling
							 | 
						||
| 
								 | 
							
								    int i = 1;
							 | 
						||
| 
								 | 
							
								    while (i < n && arr[i] <= x)
							 | 
						||
| 
								 | 
							
								        i = i*2;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								    //  Call binary search for the found range.
							 | 
						||
| 
								 | 
							
								    return binarySearch(arr, i/2, min(i, n), x);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								// A recursive binary search function. It returns
							 | 
						||
| 
								 | 
							
								// location of x in  given array arr[l..r] is
							 | 
						||
| 
								 | 
							
								// present, otherwise -1
							 | 
						||
| 
								 | 
							
								int binarySearch(int arr[], int l, int r, int x)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if (r >= l)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        int mid = l + (r - l)/2;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								        // If the element is present at the middle
							 | 
						||
| 
								 | 
							
								        // itself
							 | 
						||
| 
								 | 
							
								        if (arr[mid] == x)
							 | 
						||
| 
								 | 
							
								            return mid;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								        // If element is smaller than mid, then it
							 | 
						||
| 
								 | 
							
								        // can only be present n left subarray
							 | 
						||
| 
								 | 
							
								        if (arr[mid] > x)
							 | 
						||
| 
								 | 
							
								            return binarySearch(arr, l, mid-1, x);
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								        // Else the element can only be present
							 | 
						||
| 
								 | 
							
								        // in right subarray
							 | 
						||
| 
								 | 
							
								        return binarySearch(arr, mid+1, r, x);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								    // We reach here when element is not present
							 | 
						||
| 
								 | 
							
								    // in array
							 | 
						||
| 
								 | 
							
								    return -1;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								int main(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   int arr[] = {2, 3, 4, 10, 40};
							 | 
						||
| 
								 | 
							
								   int n = sizeof(arr)/ sizeof(arr[0]);
							 | 
						||
| 
								 | 
							
								   int x = 10;
							 | 
						||
| 
								 | 
							
								   int result = exponentialSearch(arr, n, x);
							 | 
						||
| 
								 | 
							
								   (result == -1)? printf("Element is not present in array")
							 | 
						||
| 
								 | 
							
								                 : printf("Element is present at index %d", result);
							 | 
						||
| 
								 | 
							
								   return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								# More Information
							 | 
						||
| 
								 | 
							
								- <a href='https://en.wikipedia.org/wiki/Exponential_search' target='_blank' rel='nofollow'>Wikipedia</a>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- <a href='https://www.geeksforgeeks.org/exponential-search/' target='_blank' rel='nofollow'>GeeksForGeeks</a>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Credits
							 | 
						||
| 
								 | 
							
								[C++ Implementation](https://www.wikitechy.com/technology/exponential-search/)
							 |