Randomized Binary Search Algorithm

25 Jan, 2022
We are given a sorted array A[] of n elements. We need to find if x is present in A or not.In binary search we always used middle element, here we will randomly pick one element in given range.In Binary Search we had 
middle = (start + end)/2
In Randomized binary search we do following  
Generate a random number t
Since range of number in which we want a random
number is [start, end]
Hence we do, t = t % (end-start+1)
Then, t = start + t;
Hence t is a random number between start and end
It is a Las Vegas randomized algorithm as it always finds the correct result.
Expected Time complexity of Randomized Binary Search Algorithm For n elements let say expected time required be T(n), After we choose one random pivot, array size reduces to say k. Since pivot is chosen with equal probability for all possible pivots, hence p = 1/n.T(n) is sum of time of all possible sizes after choosing pivot multiplied by probability of choosing that pivot plus time take to generate random pivot index.Hence
T(n) = p*T(1) + p*T(2) + ..... + p*T(n) + 1
putting p = 1/n
T(n) = ( T(1) + T(2) + ..... + T(n) ) / n + 1
n*T(n) = T(1) + T(2) + .... + T(n) + n      .... eq(1)
Similarly for n-1
(n-1)*T(n-1) = T(1) + T(2) + ..... + T(n-1) + n-1    .... eq(2)
Subtract eq(1) - eq(2)
n*T(n) - (n-1)*T(n-1) = T(n) + 1
(n-1)*T(n) - (n-1)*T(n-1) =  1
(n-1)*T(n) = (n-1)*T(n-1) + 1
T(n) = 1/(n-1) + T(n-1)
T(n) = 1/(n-1) + 1/(n-2) + T(n-2)
T(n) = 1/(n-1) + 1/(n-2) + 1/(n-3) + T(n-3)
Similarly,
T(n) = 1 + 1/2 + 1/3 + ... + 1/(n-1)
Hence T(n) is equal to (n-1)th Harmonic number, 
n-th harmonic number is O(log n)
Hence T(n) is O(log n) 
Recursive implementation of Randomized Binary Search  
C++
Java
Python3
C#
Javascript
// C++ program to implement recursive// randomized algorithm.#include <iostream>#include <ctime>using namespace std; // To generate random number// between x and y ie.. [x, y]int getRandom(int x, int y){    srand(time(NULL));    return (x + rand() % (y-x+1));} // A recursive randomized binary search function.// It returns location of x in// given array arr[l..r] is present, otherwise -1int randomizedBinarySearch(int arr[], int l,                            int r, int x){    if (r >= l)    {        // Here we have defined middle as        // random index between l and r ie.. [l, r]        int mid = getRandom(l, r);         // 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 in left subarray        if (arr[mid] > x)          return randomizedBinarySearch(arr, l,                                    mid-1, x);         // Else the element can only be present        // in right subarray        return randomizedBinarySearch(arr, mid+1,                                         r, x);    }     // We reach here when element is not present    // in array    return -1;} // Driver codeint main(void){    int arr[] = {2, 3, 4, 10, 40};    int n = sizeof(arr)/ sizeof(arr[0]);    int x = 10;    int result = randomizedBinarySearch(arr, 0, n-1, x);    (result == -1)? printf("Element is not present in array")    : printf("Element is present at index %d", result);    return 0;}
// Java program to implement recursive// randomized algorithm.public class RandomizedBinarySearch{     // To generate random number    // between x and y ie.. [x, y]    public static int getRandom(int x, int y)    {        return (x + (int)(Math.random() % (y-x+1)));    }     // A recursive randomized binary search function.    // It returns location of x in    // given array arr[l..r] is present, otherwise -1    public static int randomizedBinarySearch(int arr[],                            int low, int high, int key)    {        if (high >= low)        {            // Here we have defined middle as            // random index between l and r ie.. [l, r]            int mid = getRandom(low, high);             // If the element is present at the            // middle itself            if (arr[mid] == key)                return mid;             // If element is smaller than mid, then            // it can only be present in left subarray            if (arr[mid] > key)                return randomizedBinarySearch(arr, low, mid-1, key);             // Else the element can only be present            // in right subarray            return randomizedBinarySearch(arr, mid+1, high, key);        }         // We reach here when element is not present        // in array        return -1;    }     // Driver code    public static void main(String[] args)    {        int arr[] = {2, 3, 4, 10, 40};        int n = arr.length;        int key = 10;        int result = randomizedBinarySearch(arr, 0, n-1, key);        System.out.println((result == -1)?"Element is not present in array":                "Element is present at index " + result);    }} // This code is contributed by JEREM
# Python3 program to implement recursive# randomized algorithm.# To generate random number# between x and y ie.. [x, y] import randomdef getRandom(x,y):    tmp=(x + random.randint(0,100000) % (y-x+1))    return tmp     # A recursive randomized binary search function.# It returns location of x in# given array arr[l..r] is present, otherwise -1 def randomizedBinarySearch(arr,l,r,x) :    if r>=l:                 # Here we have defined middle as        # random index between l and r ie.. [l, r]        mid=getRandom(l,r)                 # 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 in left subarray        if arr[mid]>x:            return randomizedBinarySearch(arr, l, mid-1, x)                     # Else the element can only be present        # in right subarray        return randomizedBinarySearch(arr, mid+1,r, x)             # We reach here when element is not present    # in array    return -1     # Driver codeif __name__=='__main__':    arr = [2, 3, 4, 10, 40]    n=len(arr)    x=10    result = randomizedBinarySearch(arr, 0, n-1, x)    if result==-1:        print('Element is not present in array')    else:        print('Element is present at index ', result)         # This code is contributes by sahilshelangia
// C# program to implement recursive// randomized algorithm.using System; class RandomizedBinarySearch{     // To generate random number    // between x and y ie.. [x, y]    public static int getRandom(int x, int y)    {        Random r = new Random();        return (x + (int)(r.Next() % (y - x + 1)));    }     // A recursive randomized binary search function.    // It returns location of x in    // given array arr[l..r] is present, otherwise -1    public static int randomizedBinarySearch(int []arr,                            int low, int high, int key)    {        if (high >= low)        {            // Here we have defined middle as            // random index between l and r ie.. [l, r]            int mid = getRandom(low, high);             // If the element is present at the            // middle itself            if (arr[mid] == key)                return mid;             // If element is smaller than mid, then            // it can only be present in left subarray            if (arr[mid] > key)                return randomizedBinarySearch(arr, low, mid - 1, key);             // Else the element can only be present            // in right subarray            return randomizedBinarySearch(arr, mid + 1, high, key);        }         // We reach here when element is not present        // in array        return -1;    }     // Driver code    public static void Main(String[] args)    {        int []arr = {2, 3, 4, 10, 40};        int n = arr.Length;        int key = 10;        int result = randomizedBinarySearch(arr, 0, n - 1, key);        Console.WriteLine((result == -1)?"Element is not present in array":                "Element is present at index " + result);    }} // This code is contributed by 29AjayKumar
<script> // Javascript program to implement recursive // To generate random number// between x and y ie.. [x, y]function getRandom(x, y) {    return (x + Math.floor(Math.random() % (y - x + 1)));} // A recursive randomized binary search function.// It returns location of x in// given array arr[l..r] is present, otherwise -1function randomizedBinarySearch(arr, l, r, x){    if (r >= l)    {             // Here we have defined middle as        // random index between l and r ie.. [l, r]        let mid = getRandom(l, r);         // 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 in left subarray        if (arr[mid] > x)            return randomizedBinarySearch(arr, l,                mid - 1, x);         // Else the element can only be present        // in right subarray        return randomizedBinarySearch(arr, mid + 1,            r, x);    }     // We reach here when element is not present    // in array    return -1;} // Driver codelet arr = [2, 3, 4, 10, 40];let n = arr.length;let x = 10;let result = randomizedBinarySearch(arr, 0, n - 1, x);(result == -1) ? document.write("Element is not present in array")    : document.write("Element is present at index " + result);         // This code is contributed by saurabh_jaiswal.</script>
Output: 
Element is present at index 3
Iterative implementation of Randomized Binary Search 
C++
Java
Python3
C#
Javascript
// C++ program to implement iterative// randomized algorithm.#include <iostream>#include <ctime>using namespace std; // To generate random number// between x and y ie.. [x, y]int getRandom(int x, int y){    srand(time(NULL));    return (x + rand()%(y-x+1));} // A iterative randomized binary search function.// It returns location of x in// given array arr[l..r] if present, otherwise -1int randomizedBinarySearch(int arr[], int l,                               int r, int x){    while (l <= r)    {        // Here we have defined middle as        // random index between l and r ie.. [l, r]        int m = getRandom(l, r);         // Check if x is present at mid        if (arr[m] == x)            return m;         // If x greater, ignore left half        if (arr[m] < x)            l = m + 1;         // If x is smaller, ignore right half        else            r = m - 1;    }     // if we reach here, then element was    // not present    return -1;} // Driver codeint main(void){    int arr[] = {2, 3, 4, 10, 40};    int n = sizeof(arr)/ sizeof(arr[0]);    int x = 10;    int result = randomizedBinarySearch(arr, 0, n-1, x);    (result == -1)? printf("Element is not present in array")        : printf("Element is present at index %d", result);    return 0;}
// Java program to implement iterative// randomized algorithm.class GFG{ // To generate random number// between x and y ie.. [x, y]static int getRandom(int x, int y){         return (int) (x + Math.random() * 10 % (y - x + 1));} // A iterative randomized binary search function.// It returns location of x in// given array arr[l..r] if present, otherwise -1static int randomizedBinarySearch(int arr[], int l,                                    int r, int x){    while (l <= r)    {        // Here we have defined middle as        // random index between l and r ie.. [l, r]        int m = getRandom(l, r);         // Check if x is present at mid        if (arr[m] == x)            return m;         // If x greater, ignore left half        if (arr[m] < x)            l = m + 1;         // If x is smaller, ignore right half        else            r = m - 1;    }     // if we reach here, then element was    // not present    return -1;} // Driver codepublic static void main(String []args){    int arr[] = {2, 3, 4, 10, 40};    int n = arr.length;    int x = 10;    int result = randomizedBinarySearch(arr, 0, n - 1, x);    if(result == -1)        System.out.printf("Element is not present in array");    else        System.out.printf("Element is present at index %d", result);}} // This code is contributed by 29AjayKumar
# Python program to implement iterative# randomized algorithm. # To generate random number# between x and y ie.. [x, y] from random import randint def getRandom(x, y):    return randint(x,y) # A iterative randomized binary search function.# It returns location of x in# given array arr[l..r] if present, otherwise -1def randomizedBinarySearch(arr, l, r, x):    while (l <= r):        # Here we have defined middle as        # random index between l and r ie.. [l, r]        m = getRandom(l, r)         # Check if x is present at mid        if (arr[m] == x):            return m         # If x greater, ignore left half        if (arr[m] < x):            l = m + 1         # If x is smaller, ignore right half        else:            r = m - 1    # if we reach here, then element was    # not present    return -1 # Driver codearr = [2, 3, 4, 10, 40]n = len(arr)x = 10result = randomizedBinarySearch(arr, 0, n-1, x)if result == 1:    print("Element is not present in array")else:    print("Element is present at index", result) # This code is contributed by ankush_953
// C# program to implement iterative// randomized algorithm.using System;using System.Collections.Generic; class GFG{ // To generate random number// between x and y ie.. [x, y]static int getRandom(int x, int y){         return (int) (x + new Random(10).Next(1) * 10 % (y - x + 1));} // A iterative randomized binary search function.// It returns location of x in// given array arr[l..r] if present, otherwise -1static int randomizedBinarySearch(int []arr, int l,                                    int r, int x){    while (l <= r)    {        // Here we have defined middle as        // random index between l and r ie.. [l, r]        int m = getRandom(l, r);         // Check if x is present at mid        if (arr[m] == x)            return m;         // If x greater, ignore left half        if (arr[m] < x)            l = m + 1;         // If x is smaller, ignore right half        else            r = m - 1;    }     // if we reach here, then element was    // not present    return -1;} // Driver codepublic static void Main(String []args){    int []arr = {2, 3, 4, 10, 40};    int n = arr.Length;    int x = 10;    int result = randomizedBinarySearch(arr, 0, n - 1, x);    if(result == -1)        Console.Write("Element is not present in array");    else        Console.Write("Element is present at index {0}", result);}} // This code is contributed by 29AjayKumar
<script> // Javascript program to implement iterative// randomized algorithm. // To generate random number// between x and y ie.. [x, y]function getRandom(x,y){     return Math.floor(x + Math.floor(Math.random() * 10) %                      (y - x + 1));} // A iterative randomized binary search function.// It returns location of x in// given array arr[l..r] if present, otherwise -1function randomizedBinarySearch(arr,l,r,x){    while (l <= r)    {                 // Here we have defined middle as        // random index between l and r ie.. [l, r]        let m = getRandom(l, r);           // Check if x is present at mid        if (arr[m] == x)            return m;           // If x greater, ignore left half        if (arr[m] < x)            l = m + 1;           // If x is smaller, ignore right half        else            r = m - 1;    }       // If we reach here, then element was    // not present    return -1;} // Driver codelet arr = [ 2, 3, 4, 10, 40 ];let n = arr.length;let x = 10;let result = randomizedBinarySearch(arr, 0, n - 1, x); if (result == -1)    document.write("Element is not present in array");else    document.write("Element is present at index ",                   result); // This code is contributed by rag2127 </script>
Output: 
Element is present at index 3
This article is contributed by Pratik Chhajer. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
sahilshelangia
JEREM
ankush_953
29AjayKumar
rag2127
_saurabh_jaiswal
Accenture
Binary Search
Infosys
Oracle
Qualcomm
TCS
Wipro
Divide and Conquer
Randomized
Searching
Infosys
Oracle
Wipro
Qualcomm
TCS
Accenture
Searching
Divide and Conquer
Binary Search
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Merge Sort
QuickSort
Binary Search
Count Inversions in an array | Set 1 (Using Merge Sort)
Median of two sorted arrays of different sizes
K'th Smallest/Largest Element in Unsorted Array | Set 2 (Expected Linear Time)
QuickSort using Random Pivoting
Shuffle a given array using Fisher–Yates shuffle Algorithm
Shuffle or Randomize a list in Java
Generating Random String Using PHP