2012-04-22 27 views
7

我有一个具有1,000或更多值(可能高达5000+)的排序整数的数组。我需要编写一个接收int的函数,并根据数组中的元素返回一个bool。我知道我可以用break来写一个for循环,我知道我可以使用jQuery .InArray。确定元素是否在排序数组中的最快方法

什么是最好的方式来实现这一点,知道该数组排序。

谢谢。

回答

9

知道该数组是排序二进制搜索将是最好的方法。

+1

肯定要走的路。 http://en.wikipedia.org/wiki/Binary_search – 2012-04-22 00:36:58

+1

http://www.nczonline.net/blog/2009/09/01/computer-science-in-javascript-binary-search/ – Pete 2012-04-22 00:38:32

+0

好的,谢谢你的小费! – frenchie 2012-04-22 00:42:22

3

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

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

在谷歌关闭中还有一个二进制搜索,代码为here

而且,对二进制搜索算法如何工作的一个很好的描述Wikipedia

-1

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

0

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

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

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

相关问题