Open In App

Exponential Search

Last Updated : 28 Mar, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

The name of this searching algorithm may be misleading as it works in O(Log n) time. The name comes from the way it searches an element.

Given a sorted array, and an element x to be 
searched, find position of x in the array.

Input:  arr[] = {10, 20, 40, 45, 55}
        x = 45
Output: Element found at index 3

Input:  arr[] = {10, 15, 25, 45, 55}
        x = 15
Output: Element found at index 1

We have discussed, linear search, binary search for this problem.
Exponential search involves two steps:  

  1. Find range where element is present
  2. Do Binary Search in above found range.

How to find the range where element may be present? 
The idea is to start with subarray size 1, compare its last element with x, then try size 2, then 4 and so on until last element of a subarray is not greater. 
Once we find an index i (after repeated doubling of i), we know that the element must be present between i/2 and i (Why i/2? because we could not find a greater value in previous iteration)
Given below are the implementations of above steps.

C++




// 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 first 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-1), 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)? cout <<"Element is not present in array"
                 : cout <<"Element is present at index " << result;
   return 0;
}
 
// this code is contributed by shivanisinghss2110


C




// C++ program to find an element x in a
// sorted array using Exponential search.
#include <stdio.h>
#include <time.h>
#include <math.h>
#define min
 
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 first 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-1), 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;
}


Java




// 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 first 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-1), 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);
    }
}


Python3




# Python program to find an element x
# in a sorted array using Exponential Search
 
# A recursive 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-1), 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 the array")
else:
    print ("Element is present at index %d" %(result))
 
# This code is contributed by Harshit Agrawal


C#




// C# program to find an element x in a
// sorted array using Exponential search.
using System;
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
    // first 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,
                       Math.Min(i, n - 1), x);
}
 
// A recursive binary search
// function. It returns location
// of x in given array arr[l..r] is
// present, otherwise -1
static 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
public static void Main()
{
    int []arr = {2, 3, 4, 10, 40};
    int n = arr.Length;
    int x = 10;
    int result = exponentialSearch(arr, n, x);
    if (result == -1)
            Console.Write("Element is not
                          present in array");
        else
            Console.Write("Element is
                           present at index "
                                   + result);
}
}
 
// This code is contributed by Smitha


PHP




<?php
// PHP program to find an element x in a
// sorted array using Exponential search.
 
// Returns position of first
// occurrence of x in array
function exponentialSearch($arr, $n, $x)
{
     
    // If x is present at
    // first location itself
    if ($arr[0] == $x)
        return 0;
 
    // Find range for binary search
    // 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 - 1), $x);
}
 
// A recursive binary search
// function. It returns location
// of x in given array arr[l..r] is
// present, otherwise -1
function 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 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
$arr = array(2, 3, 4, 10, 40);
$n = count($arr);
$x = 10;
$result = exponentialSearch($arr, $n, $x);
if($result == -1)
    echo "Element is not present in array";
else
    echo "Element is present at index ",
                                $result;
 
// This code is contributed by anuj_67
?>


Javascript




<script>
 
// Javascript program to find an element x
// in a sorted array using Exponential Search
  
// A recursive binary search
// function. It returns location
// of x in given array arr[l..r] is
// present, otherwise -1
function binarySearch(arr, l, r, x)
{
    if (r >= l)
    {
        let 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;
}
 
 // Returns position of first
// occurrence of x in array
function exponentialSearch(arr, n, x)
{
      
    // If x is present at
    // first location itself
    if (arr[0] == x)
        return 0;
  
    // Find range for binary search
    // by repeated doubling
    let i = 1;
    while (i < n && arr[i] <= x)
        i = i * 2;
  
    // Call binary search for
    // the found range.
    return binarySearch(arr, i/2,
                       Math.min(i, n - 1), x);
}
     
 
// Driver Code
     
    let arr = [2, 3, 4, 10, 40];
    let n = arr.length;
    let x = 10;
    let result = exponentialSearch(arr, n, x);
    if (result == -1)
         document.write("Element is not present in array");
    else
        document.write("Element is present at index " + result);
 
</script>


Output

Element is present at index 3

Time Complexity : O(Log n) 
Auxiliary Space : The above implementation of Binary Search is recursive and requires O(Log n) space. With iterative Binary Search, we need only O(1) space.
Applications of Exponential Search: 

  1. Exponential Binary Search is particularly useful for unbounded searches, where size of array is infinite. Please refer Unbounded Binary Search for an example.
  2. It works better than Binary Search for bounded arrays, and also when the element to be searched is closer to the first element.

Reference: 
https://en.wikipedia.org/wiki/Exponential_search

 

Approach 2: Iterative implementation

Here’s how it works:

   We start with an index i equal to 1 and repeatedly double it until either i is greater than or equal to the length of the array or the value at index i is greater than or equal to the target value x.
   We then perform a binary search on the range [i/2, min(i, n-1)], where n is the length of the array. This range is guaranteed to contain the target value, if it is present in the array, because we know that the target value must be greater than or equal to the value at index i/2 and less than or equal to the value at index min(i, n-1).
   If we find the target value in the binary search, we return its index. Otherwise, we return -1 to indicate that the target value is not present in the array.

C++




#include<bits/stdc++.h>
using namespace std;
 
 
int exponential_search(vector<int> arr,int x){
    int n = arr.size();
     
    if(n == 0)
        return -1;
 
    // Find range for binary search by repeatedly doubling i
    int i = 1;
    while(i < n and arr[i] < x)
        i *= 2;
 
    // Perform binary search on the range [i/2, min(i, n-1)]
    int left = i /2;
    int right = min(i, n-1);
 
    while(left <= right){
        int mid = (left + right)/2;
         
        if(arr[mid] == x) return mid;
        else if(arr[mid] < x) left = mid + 1;
        else right = mid - 1;
    }
 
    return -1;
}
     
 
// Driver Code
int main(){
     
    vector<int> arr = {2, 3, 4, 10, 40};
    int n = arr.size();
    int x = 10;
    int result = exponential_search(arr, x);
     
    if(result == -1){
        cout << "Element not found in the array";
    }
    else{
        cout << "Element is present at index " << result << endl;
    }
    return 0;
}
 
// This code is contributed by Ajay singh


Java




// Java implementation of above approach
import java.util.*;
 
class Main {
   
  // Exponential search function
    public static int exponential_search(ArrayList<Integer> arr, int x) {
    int n = arr.size();
     
    if (n == 0)
        return -1;
     
    // Find range for binary search by repeatedly doubling i
    int i = 1;
    while (i < n && arr.get(i) < x)
        i *= 2;
     
    // Perform binary search on the range [i/2, min(i, n-1)]
    int left = i / 2;
    int right = Math.min(i, n - 1);
     
    while (left <= right) {
        int mid = (left + right) / 2// finding mid
         
        if (arr.get(mid) == x)
            return mid;
        else if (arr.get(mid) < x)
            left = mid + 1;
        else
            right = mid - 1;
    }
     
    return -1;
}
 
// Driver Code
public static void main(String[] args) {
    ArrayList<Integer> arr = new ArrayList<>(Arrays.asList(2, 3, 4, 10, 40));
    int n = arr.size();
    int x = 10;
    int result = exponential_search(arr, x);
     
    if (result == -1) {
        System.out.println("Element not found in the array");
    }
    else {
        System.out.println("Element is present at index " + result);
    }
}
 
}


Python




def exponential_search(arr, x):
    n = len(arr)
    if n == 0:
        return -1
 
    # Find range for binary search by repeatedly doubling i
    i = 1
    while i < n and arr[i] < x:
        i *= 2
 
    # Perform binary search on the range [i/2, min(i, n-1)]
    left = i // 2
    right = min(i, n-1)
 
    while left <= right:
        mid = (left + right) // 2
        if arr[mid] == x:
            return mid
        elif arr[mid] < x:
            left = mid + 1
        else:
            right = mid - 1
 
    return -1
 
     
 
# Driver Code
arr = [2, 3, 4, 10, 40]
n = len(arr)
x = 10
result = exponential_search(arr, x)
if result == -1:
    print ("Element not found in the array")
else:
    print ("Element is present at index %d" %(result))
 
# This code is contributed by Ajay singh


C#




// C# Program for the above approach
 
using System;
using System.Collections.Generic;
 
class Program
{
    static int exponential_search(List<int> arr, int x)
    {
        int n = arr.Count;
 
        if (n == 0)
            return -1;
 
        // Find range for binary search by repeatedly doubling i
        int i = 1;
        while (i < n && arr[i] < x)
            i *= 2;
 
        // Perform binary search on the range [i/2, min(i, n-1)]
        int left = i / 2;
        int right = Math.Min(i, n - 1);
 
        while (left <= right)
        {
            int mid = (left + right) / 2;
 
            if (arr[mid] == x) return mid;
            else if (arr[mid] < x) left = mid + 1;
            else right = mid - 1;
        }
 
        return -1;
    }
 
    static void Main(string[] args)
    {
        List<int> arr = new List<int> { 2, 3, 4, 10, 40 };
        int n = arr.Count;
        int x = 10;
        int result = exponential_search(arr, x);
 
        if (result == -1)
        {
            Console.WriteLine("Element not found in the array");
        }
        else
        {
            Console.WriteLine("Element is present at index " + result);
        }
    }
}
 
// This code is contributed by princekumaras


Javascript




function exponential_search(arr, x) {
  const n = arr.length;
  if (n == 0) { // if array is empty, return -1
    return -1;
  }
 
  let i = 1;
  while (i < n && arr[i] < x) { // Find the range for binary search by repeatedly doubling i
    i *= 2;
  }
 
  const left = Math.floor(i / 2); // Set left boundary for binary search
  const right = Math.min(i, n - 1); // Set right boundary for binary search
 
  while (left <= right) { // Perform binary search on the range [i/2, min(i, n-1)]
    const mid = Math.floor((left + right) / 2); // Find middle index
    if (arr[mid] == x) { // If element is found at mid index, return mid
      return mid;
    } else if (arr[mid] < x) { // If element is less than mid index, search the right half of array
      left = mid + 1;
    } else { // If element is greater than mid index, search the left half of array
      right = mid - 1;
    }
  }
 
  return -1; // If element is not found in array, return -1
}
 
// Driver Code
const arr = [2, 3, 4, 10, 40];
const n = arr.length;
const x = 10;
const result = exponential_search(arr, x);
if (result == -1) {
  console.log("Element not found in the array");
} else {
  console.log(`Element is present at index ${result}`);
}


Output

Element is present at index 3

Time Complexity : O(Log n) 
Auxiliary Space :  O(1) space.



Previous Article
Next Article

Similar Reads

Is exponential search faster than binary search?
Exponential search and binary search are two algorithms used to find a target element in a sorted array. While both algorithms have their advantages and disadvantages, exponential search is generally not considered to be faster than binary search. Time Complexity of Exponential Search:The time complexity of exponential search is O(log n), where n i
2 min read
Exponential notation of a decimal number
Given a positive decimal number, find the simple exponential notation (x = a·10^b) of the given number. Examples: Input : 100.0 Output : 1E2 Explanation: The exponential notation of 100.0 is 1E2. Input :19 Output :1.9E1 Explanation: The exponential notation of 16 is 1.6E1. Approach: The simplest way is to find the position of the first non zero dig
5 min read
Find the larger exponential among two exponentials
Given four integers A, B, C and D. The task is to find which is greater AB or CD. Examples: Input: A = 2, B = 5, C = 4, D = 2 Output: 2^5 25 = 32 42 = 16 Input: A = 8, B = 29, C = 60, D = 59 Output: 60^59 Naive approach: Calculate the values of AB and CD then compare them. This approach will fail when the values are greater say 562145321457. Effici
4 min read
Count of exponential paths in a Binary Tree
Given a Binary Tree, the task is to count the number of Exponential paths in the given Binary Tree. Exponential Path is a path where root to leaf path contains all nodes being equal to xy, &amp; where x is a minimum possible positive constant &amp; y is a variable positive integer. Example: Input: 27 / \ 9 81 / \ / \ 3 10 70 243 / \ 81 909 Output:
11 min read
Print all Exponential Levels of a Binary Tree
Given a Binary Tree, the task is to print all the Exponential Levels in the given Binary Tree. An Exponential Level is a level whose all nodes of that levels equals to xy, &amp; where x is a minimum possible positive constant &amp; y is a variable positive integer. Examples: Input: 20 / \ 9 81 / \ / \ 3 10 70 243 / \ 81 909 Output: 20 9 81 Explanat
15+ min read
Exponential factorial of N
Given a positive integer N, the task is to print the Exponential factorial of N. Since the output can be very large, print the answer modulus 1000000007. Examples: Input: N = 4 Output: 262144 Input: N = 3 Output: 9 Approach: The given problem can be solved based on the following observations: The exponential factorial is defined by the recurrence r
4 min read
Find all ranges of consecutive numbers from Array | Set -2 (using Exponential BackOff)
Given a sorted array arr[] consisting of N integers without any duplicates, the task is to find the ranges of consecutive numbers from that array. Examples: Input: arr[] = {1, 2, 3, 6, 7} Output: 1-&gt;3, 6-&gt;7 Explanation: There are two ranges of consecutive number from that array. Range 1 = 1 -&gt; 3 Range 2 = 6 -&gt; 7 Input: arr[] = {-1, 0, 1
11 min read
Exponential Squaring (Fast Modulo Multiplication)
Given two numbers base and exp, we need to compute baseexp under Modulo 10^9+7 Examples: Input : base = 2, exp = 2Output : 4Input : base = 5, exp = 100000Output : 754573817In competitions, for calculating large powers of a number we are given a modulus value(a large prime number) because as the values of [Tex]x^y [/Tex]is being calculated it can ge
12 min read
Exponential value sort
Given a sorted array arr[] and an integer P. Your task is to raise elements of arr[] to power of P and return them in sorted order in a new array. Examples:Input: arr[] = {-20, -5, 1, 2, 8}, P=2Output: 1 4 25 64 400Explanation: When we square the values of arr we get 400,25,1,4,64 which then sorted will give us the values as [1,4,25,64,400]. We hav
8 min read
Difference Between Exponential and Polynomial Complexities
Understanding the computational complexity of algorithms is essential in computer science, as it helps determine the feasibility and efficiency of solutions to problems. Two of the most common types of complexities are exponential and polynomial complexities. This article will provided the differences between these two, explaining their characteris
4 min read
Article Tags :
Practice Tags :
three90RightbarBannerImg