Skip to content

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
  // 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

  1. It is generally used for unbounded searches, where the array size may be infinite.
  2. 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