Exponential Search
In this tutorial, you will learn about exponential search. Also, you will find working examples of exponential search in C, C++, Java and Python.
Given a sorted array of n elements, search for an element x in the array.
Linear Search will take O(n) time while Binary Search needs O(log n) time.
Exponential search involves two steps: finding range where element is present and performing Binary Search in above found range.
Exponential Search Algorithm¶
1. Starting with subarray size of 1, compare the its last element with x 
2. Repeat step 1 doubling the subarray size each time (eg, 2,4,8 etc) until the last element is greater than x
3. Let this position be pos. So x lies between pos/2 and pos 
4. Perform binary search using the subarray from pos/2 and pos
Implementation of Exponential Search¶
  // C program to implement exponential search 
  // with recursion 
  #include <stdio.h> 
  // If x is present in arr[0..n-1], then returns  
  // index of it, else returns -1.  
  int binarySearch(int arr[], int, int, int); 
  // Returns position of first occurrence 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; 
  } 
  // Driver code 
  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; 
  } 
  // 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 occurrence 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; 
  } 
  // Driver code 
  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; 
  } 
  # Python program to find an element x 
  # in a sorted array using Exponential Search 
  # A recurssive binary search function returns  
  # location  of x in given array arr[l..r] is  
  # present, otherwise -1 
  def binarySearch( arr, l, r, x): 
      if r >= l: 
          mid = l + ( r-l ) / 2
          # If the element is present at  
          # the middle itself 
          if arr[mid] == x: 
              return mid 
          # If the element is smaller than mid,  
          # then it can only be present in the  
          # left subarray 
          if arr[mid] > x: 
              return binarySearch(arr, l,  
                                  mid - 1, x) 
          # Else he element can only be 
          # present in the right 
          return binarySearch(arr, mid + 1, r, x) 
      # We reach here if the element is not present 
      return -1
  # Returns the position of first 
  # occurrence of x in array 
  def exponentialSearch(arr, n, x): 
      # IF x is present at first  
      # location itself 
      if arr[0] == x: 
          return 0
      # Find range for binary search  
      # j by repeated doubling 
      i = 1
      while i < n and arr[i] <= x: 
          i = i * 2
      # Call binary search for the found range 
      return binarySearch( arr, i / 2,  
                          min(i, n), x) 
  # Driver Code 
  arr = [2, 3, 4, 10, 40] 
  n = len(arr) 
  x = 10
  result = exponentialSearch(arr, n, x) 
  if result == -1: 
      print "Element not found in thye array"
  else: 
      print "Element is present at index %d" %(result) 
  // Java     program to find an element x in a 
  // sorted array using Exponential search. 
  import java.util.Arrays; 
  class GFG 
  { 
      // Returns position of first occurrence of 
      // x in array 
      static 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 Arrays.binarySearch(arr, i/2,  
                                  Math.min(i, n), x); 
      } 
      // Driver code 
      public static void main(String args[]) 
      { 
          int arr[] = {2, 3, 4, 10, 40}; 
          int x = 10; 
          int result = exponentialSearch(arr, arr.length, x); 
          System.out.println((result < 0) ?  
                              "Element is not present in array" : 
                              "Element is present at index " +  
                              result); 
      } 
  } 
Exponential Search Complexities¶
Time Complexity = O(log n)
Space Complexity = O(1) for Iterative Exponential Search and O(log n) for Recursive Exponential Search
Exponential Search Applications¶
- It is generally used for unbounded searches, where the array size may be infinite.
 - It is also useful for bounded searches where x lies closer to the first element.
 
See also :¶
Linear Search
Jump Search
Binary Search
Interpolation Search