【问题标题】:What is the best way to search for an item in a sorted list in javascript?在javascript中搜索排序列表中的项目的最佳方法是什么?
【发布时间】:2009-12-03 01:18:30
【问题描述】:

我有一个有序的整数列表,并想搜索它们。

最快的方法是什么?

这是最快的吗?或者我们可以优化它,因为它是有序的?

Array.prototype.Contains = function(value) {
    for (var index = 0; index < this.length; index++) {
        if (value == this[index]) {
            return true;
        }
    }
    return false;
}

谢谢

【问题讨论】:

  • 这不是重复的,因为我特意询问的是有序列表。

标签: javascript arrays sorting


【解决方案1】:

尝试实现“binary search”:

Array.prototype.binarySearch = function(v) {

    /* ARRAY MUST BE SORTED */

    if ( !this.length ) { return false; }
    if ( this[0] === v ) { return true; }

    var i, mid,
        start = 0,
        end = this.length,
        c = false;

    while ( c = (i = this[mid = start+((end-start)>>1)]) !== v ) {

        i < v ? (start = mid) : (end = mid);

        if (start >= end - 1) { break; }

    }

    return !c;

};

【讨论】:

  • 可能你应该在顶部添加if(this[0]==v)return true;,因为它似乎跳过了索引0;
  • 嗯,不知道你的意思。 [44].binarySearch(44) 返回true
  • [44,45].binarySearch(44);此处返回 false。
  • [].binarySearch() 返回true
  • 这些天检查后人的注意事项:不要修改内置插件。可能会导致某些 javascript 实现的性能大幅下降,否则这些实现可能会在本机预编译代码中提供巨大的优化。
【解决方案2】:

如果列表已排序,最快的方法是总是二分查找。这适用于所有语言,只要您有一个有序列表即可。

http://en.wikipedia.org/wiki/Binary_search_algorithm

【讨论】:

    【解决方案3】:

    从排序列表中返回找到的项目的索引通常很方便。可选的第二个参数确定是否返回布尔值或索引。

    Array.prototype.biSearch= function(v, ret){
     var L= this.length, i= -1, m;
     while(L - i> 1){
      if(this[m= L + i>> 1]< v) i= m;
      else L= m;
     }
     if(ret) return this[L]== v? L: -1;
     return this[L]== v;
    }
    

    几乎相同的代码可用于另一个常见任务——将项目添加到已排序的数组中,而无需重新排序整个数组。

    如果不发送第二个参数,则仅当数组中不存在该项目时才会插入该项目。

    Array.prototype.addtoSort= function(v, dup){
     var L= this.length, i= -1, m;
     while(L - i> 1){
      if(this[m= L + i>> 1]< v) i= m;
      else L= m;
     }
     if(this[L]!= v || dup){
      return this.splice(L,0,v);
     }
     return this.length;
    }
    

    【讨论】:

    • 感谢@Kennebec,这是插入有序列表的一个非常有趣且重要的用途。幸运的是,在我的情况下,它是一个只读列表,但我绝对可以看到它的用途。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    相关资源
    最近更新 更多