确定元素是否在排序数组中的最快方法

时间:2012-04-22 00:32:22

标签: javascript arrays sorted

我有一组排序的整数,其中包含1,000或更多值(最多可达5000+)。我需要编写一个接收int的函数,并根据数组中的元素返回一个bool。我知道我可以用休息写一个for循环,我知道我可以使用jquery .InArray。

实现此目的的最佳方法是什么,知道数组已经排序。

感谢。

5 个答案:

答案 0 :(得分:10)

知道数组已经排序,二元搜索将是最好的方法。

答案 1 :(得分:8)

我认为你想要使用二进制搜索例程。二进制搜索例程为enter image description here,而线性搜索平均为enter image description here

选择表格有很多变化。这是我在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;
}

这个来自this article的简单版本,具有多种不同语言的二进制搜索功能。

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

Google闭包中还有一个二进制搜索,代码为here

并且,很好地描述了二进制搜索算法如何在Wikipedia上运行。

答案 2 :(得分:3)

如果数组已排序,那么答案的排序 - 使用二进制印章。

答案 3 :(得分:0)

如果多次执行查找,请迁移到类似地图的对象。

&#13;
&#13;
var fastLookup = {};
mySortedArray.forEach(function(i){fastLookup[i]=true)});

//Each time:
  if (fastLookup[key]===true){ //do thing
  }
&#13;
&#13;
&#13;

答案 4 :(得分:-1)

许多语言已经实现了这一点,例如在java中你可以使用CollectionsCollections.binarySearch(List&gt; list,T key)方法,我很确定C#也有某种BinarySearch方法。

相关问题