Skip to content
Related Articles

Related Articles

Improve Article

Sparse Search

  • Difficulty Level : Easy
  • Last Updated : 21 Jun, 2021
Geek Week

Given a sorted array of strings which is interspersed with empty strings, write a method to find the location of a given string.
Examples: 
 

Input : arr[] = {"for", "geeks", "", "", "", "", "ide", 
                      "practice", "", "", "", "quiz"}
          x = "geeks"
Output : 1

Input : arr[] = {"for", "geeks", "", "", "", "", "ide", 
                      "practice", "", "", "", "quiz"}, 
          x = "ds"
Output : -1

 

If there were no empty strings then we could’ve simply performed binary search. We can still use Binary Search with a little modification. If our mid is empty we just have to move mid to closest Non-Empty string.
Below is a implementation of above approach. 
 

C++




// C++ program to implement binary search
// in a sparse array.
#include <bits/stdc++.h>
using namespace std;
 
/* Binary Search in an array with blanks */
int binarySearch(string *arr, int low, int high, string x) {
  if (low > high)
    return -1;
 
  int mid = (low + high) / 2;
 
  /*Modified Part*/
  if (arr[mid] == "") {
    int left = mid - 1;
    int right = mid + 1;
 
    /*Search for both side for a non empty string*/
    while (1) {
 
      /* No non-empty string on both sides */
      if (left < low && right > high)
        return -1;
 
      if (left >= low && arr[left] != "") {
        mid = left;
        break;
      }
 
      else if (right <= high && arr[right] != "") {
        mid = right;
        break;
      }
 
      left--;
      right++;
    }
  }
 
  /* Normal Binary Search */
  if (arr[mid] == x)
    return mid;
  else if (arr[mid] > x)
    return binarySearch(arr, low, mid - 1, x);
  else
    return binarySearch(arr, mid + 1, high, x);
}
 
int sparseSearch(string arr[], string x, int n) {
  return binarySearch(arr, 0, n - 1, x);
}
 
int main() {
  ios_base::sync_with_stdio(false);
 
  string arr[] = {"for", "geeks", "", "", "", "", "ide",
                      "practice", "", "", "", "quiz"};
  string x = "geeks";
  int n = sizeof(arr) / sizeof(arr[0]);
  int index = sparseSearch(arr, x, n);
  if (index != -1)
    cout << x << " found at index " << index << "\n";
  else
    cout << x << " not found\n";
  return 0;
}

Java




// Java program to implement binary search
// in a sparse array.
 
class solution
{
 
// Binary Search in an array with blanks
static int binarySearch(String arr[], int low, int high, String x) {
if (low > high)
    return -1;
 
int mid = (low + high) / 2;
 
//Modified Part
if (arr[mid] == "") {
    int left = mid - 1;
    int right = mid + 1;
 
    /*Search for both side for a non empty string*/
    while (true) {
 
    /* No non-empty string on both sides */
    if (left < low && right > high)
        return -1;
 
    if (left >= low && arr[left] != "") {
        mid = left;
        break;
    }
 
    else if (right <= high && arr[right] != "") {
        mid = right;
        break;
    }
 
    left--;
    right++;
    }
}
 
/* Normal Binary Search */
if (arr[mid] == x)
    return mid;
else if (x.compareTo(arr[mid]) < 0)
    return binarySearch(arr, low, mid - 1, x);
else
    return binarySearch(arr, mid + 1, high, x);
}
 
static int sparseSearch(String arr[], String x, int n) {
return binarySearch(arr, 0, n - 1, x);
}
 
public static void main(String args[]) {
 
String arr[] = {"for", "geeks", "", "", "", "", "ide",
                    "practice", "", "", "", "quiz"};
String x = "geeks";
int n = x.length();
int index = sparseSearch(arr, x, n);
if (index != -1)
    System.out.println(x+ " found at index "+index);
else
    System.out.println(x+" not found");
 
}
}
 
// This code is implemented by
// Surendra_Gangwar

Python3




# Python3 program to implement binary search
#  in a sparse array
 
def sparseSearch(arr , key , low , high):
 
    left = 0; right = 0
 
    while low <= high:
 
            mid = low + (high - low) // 2
 
            if arr[mid] == '':
                left = mid - 1
                right = mid + 1
 
                while True:
 
                    # Check for out of bounds
                    if left < low and right > high:
                        return -1
 
                    elif left >= low and arr[left] != '':
                        # Search left
                        mid = left
                        break
 
                    elif right <= high and arr[right] != '':
                        # Search right
                        mid = right
                        break
 
                    left -= 1
                    right += 1
 
            if arr[mid] == key:
                print('Found string {} at index {}'.format
                     (arr[mid] , mid))
                return mid
 
            # Classical Binary search
            # search left
            elif arr[mid] > key:
                high = mid - 1
 
            # search right
            elif arr[mid] < key:
                low = mid + 1
 
    return -1
 
if __name__ == '__main__':
 
    arr = ["for", "geeks", "", "", "", "", "ide",
           "practice", "", "", "", "quiz"]                
    key = 'geeks'
 
    low = 0
    high = len(arr) - 1
 
    sparseSearch(arr , key , low , high)
 
# This is  Code contributed by
# Ashwin Viswanathan
# Additional Updates by Meghna Natraj

C#




// C# program to implement binary search
// in a sparse array.
using System;
using System.Collections.Generic;
 
class GFG{
     
// Binary Search in an array with blanks
static int binarySearch(string []arr, int low,
                        int high, string x)
{
    if (low > high)
        return -1;
     
    int mid = (low + high) / 2;
     
    // Modified Part
    if (arr[mid] == "")
    {
        int left = mid - 1;
        int right = mid + 1;
     
        // Search for both side for
        // a non empty string
        while (true)
        {
             
            // No non-empty string on both sides
            if (left < low && right > high)
                return -1;
         
            if (left >= low && arr[left] != "")
            {
                mid = left;
                break;
            }
         
            else if (right <= high &&
                arr[right] != "")
            {
                mid = right;
                break;
            }
             
            left--;
            right++;
        }
    }
 
    // Normal Binary Search
    if (arr[mid] == x)
        return mid;
         
    else if (x.CompareTo(arr[mid]) < 0)
        return binarySearch(arr, low,
                            mid - 1, x);
    else
        return binarySearch(arr, mid + 1,
                           high, x);
}
 
static int sparseSearch(string []arr,
                        string x, int n)
{
    return binarySearch(arr, 0, n - 1, x);
}
 
// Driver Code
public static void Main(string[] args)
{
    string []arr = { "for", "geeks", "", "",
                     "", "", "ide""practice",
                     "", "", "", "quiz"};
                      
    string x = "geeks";
    int n = x.Length;
     
    int index = sparseSearch(arr, x, n);
     
    if (index != -1)
        Console.Write(x + " found at index " +
                      index);
    else
        Console.Write(x + " not found");
}
}
 
// This code is contributed by rutvik_56

Javascript




<script>
// Javascript program to implement binary search
// in a sparse array.
 
// Binary Search in an array with blanks
function binarySearch(arr, low, high, x) {
    if (low > high)
        return -1;
 
    let mid = Math.floor((low + high) / 2);
 
    // Modified Part
    if (arr[mid] == "")
    {
        let left = mid - 1;
        let right = mid + 1;
 
        /*Search for both side for a non empty string*/
        while (true) {
 
            /* No non-empty string on both sides */
            if (left < low && right > high)
                return -1;
 
            if (left >= low && arr[left] != "") {
                mid = left;
                break;
            }
 
            else if (right <= high && arr[right] != "") {
                mid = right;
                break;
            }
 
            left--;
            right++;
        }
    }
 
    /* Normal Binary Search */
    if (arr[mid] == x)
        return mid;
    else if (arr[mid] > x)
        return binarySearch(arr, low, mid - 1, x);
    else
        return binarySearch(arr, mid + 1, high, x);
}
 
function sparseSearch(arr, x, n) {
    return binarySearch(arr, 0, n - 1, x);
}
 
let arr = ["for", "geeks", "", "", "", "", "ide",
    "practice", "", "", "", "quiz"];
let x = "geeks";
let n = x.length;
let index = sparseSearch(arr, x, n);
if (index != -1)
    document.write(x + " found at index " + index);
else
    document.write(x + " not found");
 
// This code is implemented by
// _saurabh_jaiswal
</script>
Output: 
geeks found at index 1

 

https://youtu.be/HS03UxTx



-uA
 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.




My Personal Notes arrow_drop_up
Recommended Articles
Page :