Open In App

Why is Binary Search preferred over Ternary Search?

Last Updated : 19 Jan, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

The following is a simple recursive Binary Search function in C++ taken from here.
 

C++




// CPP program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
 
// 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
        // in 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;
}
 
// This code is contributed by sanjoy_62.


C




// 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
        // in 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;
}


Java




// 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
        // in 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;
}
 
// This code is contributed by gauravrajput1


Python3




# A recursive binary search function. It 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 element is smaller than mid, then it can only be present
   # in 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;
  
# This code is contributed by umadevi9616


C#




// 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
        // in 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;
}
 
// This code is contributed by gauravrajput1


Javascript




<script>
// 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)
   {
        var 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
        // in 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;
}
 
// This code is contributed by gauravrajput1
</script>


The following is a simple recursive Ternary Search function :
 

C++




// A recursive ternary search function. It returns location of x in
// given array arr[l..r] is present, otherwise -1
int ternarySearch(int arr[], int l, int r, int x)
{
   if (r >= l)
   {
        int mid1 = l + (r - l)/3;
        int mid2 = mid1 + (r - l)/3;
 
        // If x is present at the mid1
        if (arr[mid1] == x)  return mid1;
 
        // If x is present at the mid2
        if (arr[mid2] == x)  return mid2;
 
        // If x is present in left one-third
        if (arr[mid1] > x) return ternarySearch(arr, l, mid1-1, x);
 
        // If x is present in right one-third
        if (arr[mid2] < x) return ternarySearch(arr, mid2+1, r, x);
 
        // If x is present in middle one-third
        return ternarySearch(arr, mid1+1, mid2-1, x);
   }
   // We reach here when element is not present in array
   return -1;
}


C




// A recursive ternary search function. It returns location of x in
// given array arr[l..r] is present, otherwise -1
int ternarySearch(int arr[], int l, int r, int x)
{
   if (r >= l)
   {
        int mid1 = l + (r - l)/3;
        int mid2 = mid1 + (r - l)/3;
 
        // If x is present at the mid1
        if (arr[mid1] == x)  return mid1;
 
        // If x is present at the mid2
        if (arr[mid2] == x)  return mid2;
 
        // If x is present in left one-third
        if (arr[mid1] > x) return ternarySearch(arr, l, mid1-1, x);
 
        // If x is present in right one-third
        if (arr[mid2] < x) return ternarySearch(arr, mid2+1, r, x);
 
        // If x is present in middle one-third
        return ternarySearch(arr, mid1+1, mid2-1, x);
   }
   // We reach here when element is not present in array
   return -1;
}


Java




import java.io.*;
 
class GFG
{
public static void main (String[] args)
{
     
// A recursive ternary search function.
// It returns location of x in given array
// arr[l..r] is present, otherwise -1
static int ternarySearch(int arr[], int l,
                         int r, int x)
{
   if (r >= l)
   {
        int mid1 = l + (r - l) / 3;
        int mid2 = mid1 + (r - l) / 3;
   
        // If x is present at the mid1
        if (arr[mid1] == x)  return mid1;
   
        // If x is present at the mid2
        if (arr[mid2] == x)  return mid2;
   
        // If x is present in left one-third
        if (arr[mid1] > x)
            return ternarySearch(arr, l, mid1 - 1, x);
   
        // If x is present in right one-third
        if (arr[mid2] < x)
            return ternarySearch(arr, mid2 + 1, r, x);
   
        // If x is present in middle one-third
        return ternarySearch(arr, mid1 + 1,
                                  mid2 - 1, x);
   }
    
   // We reach here when element is
   // not present in array
   return -1;
}
}


Python3




# A recursive ternary search function. It returns location of x in
# given array arr[l..r] is present, otherwise -1
def ternarySearch(arr, l, r, x):
    if (r >= l):
        mid1 = l + (r - l)//3
        mid2 = mid1 + (r - l)//3
  
        # If x is present at the mid1
        if arr[mid1] == x:
            return mid1
  
        # If x is present at the mid2
        if arr[mid2] == x:
            return mid2
  
        # If x is present in left one-third
        if arr[mid1] > x:
            return ternarySearch(arr, l, mid1-1, x)
  
        # If x is present in right one-third
        if arr[mid2] < x:
            return ternarySearch(arr, mid2+1, r, x)
  
        # If x is present in middle one-third
        return ternarySearch(arr, mid1+1, mid2-1, x)
    
    # We reach here when element is not present in array
    return -1
    
# This code is contributed by ankush_953
   


C#




     
// A recursive ternary search function.
// It returns location of x in given array
// arr[l..r] is present, otherwise -1
static int ternarySearch(int []arr, int l,
                         int r, int x)
{
   if (r >= l)
   {
        int mid1 = l + (r - l) / 3;
        int mid2 = mid1 + (r - l) / 3;
   
        // If x is present at the mid1
        if (arr[mid1] == x)  return mid1;
   
        // If x is present at the mid2
        if (arr[mid2] == x)  return mid2;
   
        // If x is present in left one-third
        if (arr[mid1] > x)
            return ternarySearch(arr, l, mid1 - 1, x);
   
        // If x is present in right one-third
        if (arr[mid2] < x)
            return ternarySearch(arr, mid2 + 1, r, x);
   
        // If x is present in middle one-third
        return ternarySearch(arr, mid1 + 1,
                                  mid2 - 1, x);
   }
    
   // We reach here when element is
   // not present in array
   return -1;
}
 
// This code is contributed by gauravrajput1


PHP




<?php
// A recursive ternary search function.
// It returns location of x in
// given array arr[l..r] is
// present, otherwise -1
function ternarySearch($arr, $l,
                       $r, $x)
{
    if ($r >= $l)
    {
        $mid1 = $l + ($r - $l) / 3;
        $mid2 = $mid1 + ($r - l) / 3;
 
        // If x is present at the mid1
        if ($arr[mid1] == $x)
            return $mid1;
 
        // If x is present
        // at the mid2
        if ($arr[$mid2] == $x)
            return $mid2;
 
        // If x is present in
        // left one-third
        if ($arr[$mid1] > $x)
            return ternarySearch($arr, $l,
                                 $mid1 - 1, $x);
 
        // If x is present in right one-third
        if ($arr[$mid2] < $x)
            return ternarySearch($arr, $mid2 + 1,
                                         $r, $x);
 
        // If x is present in
        // middle one-third
        return ternarySearch($arr, $mid1 + 1,
                             $mid2 - 1, $x);
}
 
// We reach here when element
// is not present in array
return -1;
}
 
// This code is contributed by anuj_67
?>


Javascript




<script>
 
    // A recursive ternary search function.
    // It returns location of x in given array
    // arr[l..r] is present, otherwise -1
    function ternarySearch(arr , l , r , x) {
        if (r >= l) {
            var mid1 = l + parseInt((r - l) / 3);
            var mid2 = mid1 + parseInt((r - l) / 3);
 
            // If x is present at the mid1
            if (arr[mid1] == x)
                return mid1;
 
            // If x is present at the mid2
            if (arr[mid2] == x)
                return mid2;
 
            // If x is present in left one-third
            if (arr[mid1] > x)
                return ternarySearch(arr, l, mid1 - 1, x);
 
            // If x is present in right one-third
            if (arr[mid2] < x)
                return ternarySearch(arr, mid2 + 1, r, x);
 
            // If x is present in middle one-third
            return ternarySearch(arr, mid1 + 1, mid2 - 1, x);
        }
 
        // We reach here when element is
        // not present in array
        return -1;
 
// This code is contributed by gauravrajput1
</script>


Which of the above two does less comparisons in worst case? 
From the first look, it seems the ternary search does less number of comparisons as it makes Log3n recursive calls, but binary search makes Log2n recursive calls. Let us take a closer look. 
The following is recursive formula for counting comparisons in worst case of Binary Search. 
 

   T(n) = T(n/2) + 2,  T(1) = 1

The following is recursive formula for counting comparisons in worst case of Ternary Search. 
 

   T(n) = T(n/3) + 4, T(1) = 1

In binary search, there are 2Log2n + 1 comparisons in worst case. In ternary search, there are 4Log3n + 1 comparisons in worst case. 
 

Time Complexity for Binary search = 2clog2n + O(1)
Time Complexity for Ternary search = 4clog3n + O(1)

Therefore, the comparison of Ternary and Binary Searches boils down the comparison of expressions 2Log3n and Log2n . The value of 2Log3n can be written as (2 / Log23) * Log2n . Since the value of (2 / Log23) is more than one, Ternary Search does more comparisons than Binary Search in worst case.
Exercise: 
Why Merge Sort divides input array in two halves, why not in three or more parts?

 



Previous Article
Next Article

Similar Reads

Why is Binary Heap Preferred over BST for Priority Queue?
A typical Priority Queue requires following operations to be efficient. Get Top Priority Element (Get minimum or maximum)Insert an elementRemove top priority elementDecrease Key A Binary Heap supports above operations with following time complexities: O(1)O(Logn)O(Logn)O(Logn) A Self Balancing Binary Search Tree like AVL Tree, Red-Black Tree, etc c
2 min read
Why Quick Sort preferred for Arrays and Merge Sort for Linked Lists?
Why is Quick Sort preferred for arrays? Below are recursive and iterative implementations of Quick Sort and Merge Sort for arrays. Recursive Quick Sort for array. Iterative Quick Sort for arrays. Recursive Merge Sort for arrays Iterative Merge Sort for arrays Quick Sort in its general form is an in-place sort (i.e. it doesn't require any extra stor
5 min read
Binary Search Tree vs Ternary Search Tree
For effective searching, insertion, and deletion of items, two types of search trees are used: the binary search tree (BST) and the ternary search tree (TST). Although the two trees share a similar structure, they differ in some significant ways. FeatureBinary Search Tree (BST)Ternary Search Tree (TST)NodeHere, each node has at most two children. H
3 min read
Is ternary search faster than binary search?
Binary search is a widely used algorithm for searching a sorted array. It works by repeatedly dividing the search space in half until the target element is found. Ternary search is a variation of binary search that divides the search space into three parts instead of two. This article explores the performance comparison between ternary search and b
3 min read
Why ternary search is not efficient?
When it comes to searching algorithms, ternary search is a technique that divides the search space into three parts instead of two like in binary search. Below are the reasons why ternary search is not considered efficient in certain scenarios. Comparison with Binary SearchIn binary search, the search space is halved with each comparison, making it
2 min read
Why use Ternary search tree (TST)?
Ternary search tree (TST) is a very popular data structure used in the problem solving becaus of following reasons: First, they offer efficient search operations, particularly for strings, with lookup times typically on the order of O(log n), where n is the length of the search key. This makes them suitable for applications requiring fast data retr
2 min read
Count of index subsets such that maximum of values over these indices in A is at least total sum over B
Given two arrays A[] and B[] consisting of N positive integers, the task is to find the total number of subsets of indices such that the maximum value in the array A[] over all these indices is greater than or equal to the sum of all values over these indices in the array B[]. Examples: Input: A[] = {3, 1}, B[] = {1, 2}Output: 2Explanation:The tota
11 min read
How to implement text Auto-complete feature using Ternary Search Tree
Given a set of strings S and a string patt the task is to autocomplete the string patt to strings from S that have patt as a prefix, using a Ternary Search Tree. If no string matches the given prefix, print "None".Examples: Input: S = {"wallstreet", "geeksforgeeks", "wallmart", "walmart", "waldomort", "word"], patt = "wall" Output: wallstreet wallm
15+ min read
Ternary Search Visualization using JavaScript
GUI(Graphical User Interface) helps better in understanding than programs. In this article, we will visualize Ternary Search using JavaScript. We will see how the elements are being traversed in Ternary Search until the given element is found. We will also visualize the time complexity of Ternary Search. Refer: Ternary SearchAsynchronous Function i
4 min read
Ternary Search Tree meaning & definition in DSA
Ternary Search Tree is defined as a special trie data structure where the child nodes of a standard trie are ordered as a binary search tree where each node can have at most three children and the left, middle and right subtrees of a node contain values that are less than, equal or greater than the node. Characteristics of Ternary Search Tree:TST i
3 min read
Article Tags :
Practice Tags :
three90RightbarBannerImg