Binary Search in Array

前端 未结 5 516
生来不讨喜
生来不讨喜 2020-11-27 05:40

How would I implement a binary search using just an array?

相关标签:
5条回答
  • 2020-11-27 06:26

    Did implement below code in Java,simple and fast /** * Binary Search using Recursion * @author asharda * */ public class BinSearch {

      /**
       * Simplistic BInary Search using Recursion
       * @param arr
       * @param low
       * @param high
       * @param num
       * @return int
       */
      public int binSearch(int []arr,int low,int high,int num)
      {
        int mid=low+high/2;
        if(num >arr[high] || num <arr[low])
        {
          return -1;
        }
    
        while(low<high)
        {
          if(num==arr[mid])
          {
            return mid;
    
          }
          else  if(num<arr[mid])
          {
           return  binSearch(arr,low,high-1, num);
          }
    
          else  if(num>arr[mid])
          {
            return binSearch(arr,low+1,high, num);
          }
    
        }//end of while
    
        return -1;
      }
    
      public static void main(String args[])
      {
        int arr[]= {2,4,6,8,10};
        BinSearch s=new BinSearch();
        int n=s.binSearch(arr, 0, arr.length-1, 10);
        String result= n>1?"Number found at "+n:"Number not found";
        System.out.println(result);
      }
    }
    
    0 讨论(0)
  • 2020-11-27 06:28

    Ensure that your array is sorted since this is the crux of a binary search.

    Any indexed/random-access data structure can be binary searched. So when you say using "just an array", I would say arrays are the most basic/common data structure that a binary search is employed on.

    You can do it recursively (easiest) or iteratively. Time complexity of a binary search is O(log N) which is considerably faster than a linear search of checking each element at O(N). Here are some examples from Wikipedia: Binary Search Algorithm:

    Recursive:

    BinarySearch(A[0..N-1], value, low, high) {  
        if (high < low)  
            return -1 // not found  
        mid = low + ((high - low) / 2) 
        if (A[mid] > value)  
            return BinarySearch(A, value, low, mid-1)  
        else if (A[mid] < value)  
            return BinarySearch(A, value, mid+1, high)  
        else
           return mid // found
        }
    

    Iterative:

      BinarySearch(A[0..N-1], value) {
       low = 0
       high = N - 1
       while (low <= high) {
           mid = low + ((high - low) / 2)
           if (A[mid] > value)
               high = mid - 1
           else if (A[mid] < value)
               low = mid + 1
           else
               return mid // found
       }
       return -1 // not found
    }
    
    0 讨论(0)
  • 2020-11-27 06:32

    Binary Search in Javascript (ES6)

    (If anyone needs)

    Bottom-up:

    function binarySearch (arr, val) {
        let start = 0;
        let end = arr.length - 1;
        let mid;
    
        while (start <= end) {
            mid = Math.floor((start + end) / 2);
    
            if (arr[mid] === val) {
                return mid;
            }
            if (val < arr[mid]) {
                end = mid - 1;
            } else {
                start = mid + 1;
            }
        }
        return -1;
    }
    

    Recursion:

    function binarySearch(arr, val, start = 0, end = arr.length - 1) {
        const mid = Math.floor((start + end) / 2);
    
        if (val === arr[mid]) {
            return mid;
        }
        if (start >= end) {
            return -1;
        }
        return val < arr[mid]
            ? binarySearch(arr, val, start, mid - 1)
            : binarySearch(arr, val, mid + 1, end);
    }
    
    0 讨论(0)
  • 2020-11-27 06:38

    It depends if you have repetition of one element in your array or no and if you care about multiple findings or not. I have two methods in this implementation. One of them returns only first finding, but the other one returns all findings of the key.

    import java.util.Arrays;
    
    public class BinarySearchExample {
    
        //Find one occurrence
        public static int indexOf(int[] a, int key) {
            int lo = 0;
            int hi = a.length - 1;
            while (lo <= hi) {
                // Key is in a[lo..hi] or not present.
                int mid = lo + (hi - lo) / 2;
                if      (key < a[mid]) hi = mid - 1;
                else if (key > a[mid]) lo = mid + 1;
                else return mid;
            }
            return -1;
        }
    
        //Find all occurrence
        public static void PrintIndicesForValue(int[] numbers, int target) {
            if (numbers == null)
                return;
    
            int low = 0, high = numbers.length - 1;
            // get the start index of target number
            int startIndex = -1;
            while (low <= high) {
                int mid = (high - low) / 2 + low;
                if (numbers[mid] > target) {
                    high = mid - 1;
                } else if (numbers[mid] == target) {
                    startIndex = mid;
                    high = mid - 1;
                } else
                    low = mid + 1;
            }
    
            // get the end index of target number
            int endIndex = -1;
            low = 0;
            high = numbers.length - 1;
            while (low <= high) {
                int mid = (high - low) / 2 + low;
                if (numbers[mid] > target) {
                    high = mid - 1;
                } else if (numbers[mid] == target) {
                    endIndex = mid;
                    low = mid + 1;
                } else
                    low = mid + 1;
            }
    
            if (startIndex != -1 && endIndex != -1){
                System.out.print("All: ");
                for(int i=0; i+startIndex<=endIndex;i++){
                    if(i>0)
                        System.out.print(',');
                    System.out.print(i+startIndex);
                }
            }
        }
    
        public static void main(String[] args) {
    
            // read the integers from a file
            int[] arr = {23,34,12,24,266,1,3,66,78,93,22,24,25,27};
            Boolean[] arrFlag = new Boolean[arr.length];
            Arrays.fill(arrFlag,false);
    
            // sort the array
            Arrays.sort(arr);
    
            //Search
            System.out.print("Array: ");
            for(int i=0; i<arr.length; i++)
                if(i != arr.length-1){
                    System.out.print(arr[i]+",");
                }else{
                    System.out.print(arr[i]);
                }
    
            System.out.println("\nOnly one: "+indexOf(arr,24));
            PrintIndicesForValue(arr,24);
    
        }
    
    }
    

    For more information, please visit https://github.com/m-vahidalizadeh/foundations/blob/master/src/algorithms/BinarySearchExample.java. I hope it helps.

    0 讨论(0)
  • 2020-11-27 06:43

    The single comparison version is fast and concise

    int bsearch_double(const double a[], int n, double v) {
      int low = 0, mid;
      while (n - low > 1) {
        mid = low + (n - low) / 2;
        if (v < a[mid]) n   = mid;
        else            low = mid;
      }
      return (low < n && a[low] == v) ? low : -1;
    }
    
    0 讨论(0)
提交回复
热议问题