Search an element in an unsorted array using minimum number of comparisons
Given an array of n distinct integers and an element x. Search the element x in the array using minimum number of comparisons. Any sort of comparison will contribute 1 to the count of comparisons. For example, the condition used to terminate a loop, will also contribute 1 to the count of comparisons each time it gets executed. Expressions like while (n) {n--;} also contribute to the count of comparisons as value of n is being compared internally so as to decide whether or not to terminate the loop.
Examples:
Input : arr[] = {4, 6, 1, 5, 8}, x = 1 Output : Found Input : arr[] = {10, 3, 12, 7, 2, 11, 9}, x = 15 Output : Not Found
Asked in Adobe Interview
Below simple method to search requires 2n + 1 comparisons in worst case.
for (i = 0; i < n; i++) // Worst case n+1 if (arr[i] == x) // Worst case n return i;
How to reduce number of comparisons?
The idea is to copy x (element to be searched) to last location so that one last comparison when x is not present in arr[] is saved.
Algorithm:
search(arr, n, x) if arr[n-1] == x // 1 comparison return "true" backup = arr[n-1] arr[n-1] = x for i=0, i++ // no termination condition if arr[i] == x // execute at most n times // that is at-most n comparisons arr[n-1] = backup return (i < n-1) // 1 comparison
// C++ implementation to search an element in
// the unsorted array using minimum number of
// comparisons
#include <bits/stdc++.h>
using namespace std;
// function to search an element in
// minimum number of comparisons
string search(int arr[], int n, int x)
{
// 1st comparison
if (arr[n - 1] == x)
return "Found";
int backup = arr[n - 1];
arr[n - 1] = x;
// no termination condition and thus
// no comparison
for (int i = 0;; i++) {
// this would be executed at-most n times
// and therefore at-most n comparisons
if (arr[i] == x) {
// replace arr[n-1] with its actual element
// as in original 'arr[]'
arr[n - 1] = backup;
// if 'x' is found before the '(n-1)th'
// index, then it is present in the array
// final comparison
if (i < n - 1)
return "Found";
// else not present in the array
return "Not Found";
}
}
}
// Driver program to test above
int main()
{
int arr[] = { 4, 6, 1, 5, 8 };
int n = sizeof(arr) / sizeof(arr[0]);
int x = 1;
cout << search(arr, n, x);
return 0;
}
// Java implementation to search an element in
// the unsorted array using minimum number of
// comparisons
import java.io.*;
class GFG {
// Function to search an element in
// minimum number of comparisons
static String search(int arr[], int n, int x)
{
// 1st comparison
if (arr[n - 1] == x)
return "Found";
int backup = arr[n - 1];
arr[n - 1] = x;
// no termination condition and thus
// no comparison
for (int i = 0;; i++) {
// this would be executed at-most n times
// and therefore at-most n comparisons
if (arr[i] == x) {
// replace arr[n-1] with its actual element
// as in original 'arr[]'
arr[n - 1] = backup;
// if 'x' is found before the '(n-1)th'
// index, then it is present in the array
// final comparison
if (i < n - 1)
return "Found";
// else not present in the array
return "Not Found";
}
}
}
// driver program
public static void main(String[] args)
{
int arr[] = { 4, 6, 1, 5, 8 };
int n = arr.length;
int x = 1;
System.out.println(search(arr, n, x));
}
}
// Contributed by Pramod Kumar
# Python3 implementation to search an
# element in the unsorted array using
# minimum number of comparisons
# function to search an element in
# minimum number of comparisons
def search(arr, n, x):
# 1st comparison
if (arr[n-1] == x) :
return "Found"
backup = arr[n-1]
arr[n-1] = x
# no termination condition and
# thus no comparison
i = 0
while(i < n) :
# this would be executed at-most n times
# and therefore at-most n comparisons
if (arr[i] == x) :
# replace arr[n-1] with its actual
# element as in original 'arr[]'
arr[n-1] = backup
# if 'x' is found before the '(n-1)th'
# index, then it is present in the
# array final comparison
if (i < n-1):
return "Found"
# else not present in the array
return "Not Found"
i = i + 1
# Driver Code
arr = [4, 6, 1, 5, 8]
n = len(arr)
x = 1
print (search(arr, n, x))
# This code is contributed by rishabh_jain
// C# implementation to search an
// element in the unsorted array
// using minimum number of comparisons
using System;
class GFG {
// Function to search an element in
// minimum number of comparisons
static String search(int[] arr, int n, int x)
{
// 1st comparison
if (arr[n - 1] == x)
return "Found";
int backup = arr[n - 1];
arr[n - 1] = x;
// no termination condition and thus
// no comparison
for (int i = 0;; i++) {
// this would be executed at-most n times
// and therefore at-most n comparisons
if (arr[i] == x) {
// replace arr[n-1] with its actual element
// as in original 'arr[]'
arr[n - 1] = backup;
// if 'x' is found before the '(n-1)th'
// index, then it is present in the array
// final comparison
if (i < n - 1)
return "Found";
// else not present in the array
return "Not Found";
}
}
}
// driver program
public static void Main()
{
int[] arr = { 4, 6, 1, 5, 8 };
int n = arr.Length;
int x = 1;
Console.WriteLine(search(arr, n, x));
}
}
// This code is contributed by Sam007
<?php
// PHP implementation to
// search an element in
// the unsorted array
// using minimum number of
// comparisons
// function to search an
// element in minimum
// number of comparisons
function search($arr, $n, $x)
{
// 1st comparison
if ($arr[$n - 1] == $x)
return "Found";
$backup = $arr[$n - 1];
$arr[$n - 1] = $x;
// no termination
// condition and thus
// no comparison
for ($i = 0; ; $i++)
{
// this would be executed
// at-most n times and
// therefore at-most
// n comparisons
if ($arr[$i] == $x)
{
// replace arr[n-1]
// with its actual element
// as in original 'arr[]'
$arr[$n - 1] = $backup;
// if 'x' is found before
// the '(n-1)th' index,
// then it is present
// in the array
// final comparison
if ($i < $n - 1)
return "Found";
// else not present
// in the array
return "Not Found";
}
}
}
// Driver Code
$arr = array( 4, 6, 1, 5, 8 );
$n = sizeof($arr);
$x = 1;
echo(search($arr, $n, $x));
// This code is contributed by Ajit.
?>
<script>
// Javascript implementation to search an
// element in the unsorted array
// using minimum number of comparisons
// Function to search an element in
// minimum number of comparisons
function search(arr, n, x)
{
// 1st comparison
if (arr[n - 1] == x)
return "Found";
let backup = arr[n - 1];
arr[n - 1] = x;
// no termination condition and thus
// no comparison
for (let i = 0;; i++) {
// this would be executed at-most n times
// and therefore at-most n comparisons
if (arr[i] == x) {
// replace arr[n-1] with its actual element
// as in original 'arr[]'
arr[n - 1] = backup;
// if 'x' is found before the '(n-1)th'
// index, then it is present in the array
// final comparison
if (i < n - 1)
return "Found";
// else not present in the array
return "Not Found";
}
}
}
let arr = [ 4, 6, 1, 5, 8 ];
let n = arr.length;
let x = 1;
document.write(search(arr, n, x));
</script>
Output:
Found
Time Complexity: O(n)
Auxiliary Space: O(1)
Number of Comparisons: Atmost (n+2) comparisons