Binary search to find the range in which the number lies

后端 未结 10 748
悲哀的现实
悲哀的现实 2020-12-16 18:31

I have an array

Values array: 12 20 32 40 52
              ^  ^  ^  ^  ^
              0  1  2  3  4

on which I have to perform binary sear

10条回答
  •  臣服心动
    2020-12-16 18:48

    I know this is an old thread, but since I had to solve a similar problem I thought I would share it. Given a set of non-overlapping ranges of integers, I need to test if a given value lies in any of those ranges. The following (in Java), uses a modified binary search to test if a value lies within the sorted (lowest to highest) set of integer ranges.

    /**
     * Very basic Range representation for long values
     *
     */
    public class Range {
    
    private long low;
    private long high;
    
    public Range(long low, long high) {
        this.low = low;
        this.high = high;
    }
    
    public boolean isInRange(long val) {
        return val >= low && val <= high;
    }
    
    public long getLow() {
        return low;
    }
    
    public void setLow(long low) {
        this.low = low;
    }
    
    public long getHigh() {
        return high;
    }
    
    public void setHigh(long high) {
        this.high = high;
    }
    
    @Override
    public String toString() {
        return "Range [low=" + low + ", high=" + high + "]";
    }
    }
    
    
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    //Java implementation of iterative Binary Search over Ranges
    class BinaryRangeSearch { 
    // Returns index of x if it is present in the list of Range, 
    // else return -1 
    int binarySearch(List ranges, int x) 
    { 
    
        Range[] arr = new Range[ranges.size()];
        arr = ranges.toArray(arr);
        int low = 0, high = arr.length - 1; 
        int iters = 0;
        while (low <= high) { 
            int mid = low + (high - low) / 2; // find mid point
    
            // Check if x is present a
            if (arr[mid].getLow() == x) {
                System.out.println(iters + " iterations");
                return mid;                 
            }
    
            // If x greater, ignore left half 
            if (x > arr[mid].getHigh()) {
                low = mid + 1; 
            }
            else if (x >= arr[mid].getLow()) {
                System.out.println(iters + " iterations");
                return mid;
            }
    
            // If x is smaller, ignore right half of remaining Ranges
            else
                high = mid - 1; 
            iters++;
        } 
    
        return -1; // not in any of the given Ranges
    } 
    
    // Driver method to test above 
    public static void main(String args[]) 
    { 
        BinaryRangeSearch ob = new BinaryRangeSearch(); 
    
        // make a test list of long Range
        int multiplier = 1;
    
        List ranges = new ArrayList<>();
        int high = 0;
        for(int i = 0; i <7; i++) {
    
            int low = i + high;
            high = (i+10) * multiplier;
            Range r = new Range(low, high);
            multiplier *= 10;
            ranges.add(r);
        }
    
        System.out.println(Arrays.toString(ranges.toArray()));
    
        int result = ob.binarySearch(ranges, 11); 
        if (result == -1) 
            System.out.println("Element not present"); 
        else
            System.out.println("Element found at "
                            + "index " + result); 
    } 
    } 
    

提交回复
热议问题