fastest way to determine if an element is in a sorted array

后端 未结 5 1334
长情又很酷
长情又很酷 2021-01-05 06:42

I have an array of sorted ints with a 1,000 or more values (could be up to 5000+). I need to write a function that receives an int and returns a bool based on the element be

相关标签:
5条回答
  • 2021-01-05 07:18

    I think you'd want to use a binary search routine. A binary search routine is enter image description here whereas a linear search is, on average, enter image description here.

    There are many variations to choose form. Here's one I found in this article:

    function binarySearch(items, value){
    
        var startIndex  = 0,
            stopIndex   = items.length - 1,
            middle      = Math.floor((stopIndex + startIndex)/2);
    
        while(items[middle] != value && startIndex < stopIndex){
    
            //adjust search area
            if (value < items[middle]){
                stopIndex = middle - 1;
            } else if (value > items[middle]){
                startIndex = middle + 1;
            }
    
            //recalculate middle
            middle = Math.floor((stopIndex + startIndex)/2);
        }
    
        //make sure it's the right value
        return (items[middle] != value) ? -1 : middle;
    }
    

    Or this simpler looking version from this article that has a binary search function in a zillion different languages.

    function binary_search_iterative(a, value) {
        var lo = 0, hi = a.length - 1, mid;
        while (lo <= hi) {
            mid = Math.floor((lo+hi)/2);
            if (a[mid] > value)
                hi = mid - 1;
            else if (a[mid] < value)
                lo = mid + 1;
            else
                return mid;
        }
        return null;
    }
    

    There's also a binary search in Google closure with the code here.

    And, a good description of how the binary search algorithm works on Wikipedia.

    0 讨论(0)
  • 2021-01-05 07:21

    If the array's sorted, then the answer's sorted - use a binary chop.

    0 讨论(0)
  • 2021-01-05 07:22

    Many languages already have this implemented for example in java you can just use CollectionsCollections.binarySearch(List> list, T key) method and I'm pretty sure C# also has some sort of BinarySearch method.

    0 讨论(0)
  • 2021-01-05 07:24

    Knowing that the array is sorted a binary search would be the best approach.

    0 讨论(0)
  • 2021-01-05 07:36

    If doing lookups more than once, migrate to a map-like object.

    var fastLookup = {};
    mySortedArray.forEach(function(i){fastLookup[i]=true)});
    
    //Each time:
      if (fastLookup[key]===true){ //do thing
      }

    0 讨论(0)
提交回复
热议问题