javascript array.indexOf的时间复杂度是多少?

时间:2013-10-10 04:24:58

标签: javascript

indexOf是简单地遍历数组还是执行更快的操作? 我知道这取决于实现,但Chrome或Firefox有什么作用?

3 个答案:

答案 0 :(得分:37)

找到与未排序数组中的值匹配的第一个索引的最有效方法是按顺序遍历列表,即O(n)。 MDN也有一些提示:

  

返回可以在数组中找到给定元素的第一个索引,如果不存在则返回-1。

     

[...]

     

的fromIndex

     

默认值:0(搜索整个数组)
  开始搜索的索引。如果索引大于或等于数组的长度,则返回-1,这意味着不会搜索该数组。如果提供的索引值为负数,则将其作为数组末尾的偏移量。注意:如果提供的索引为负数,仍会从前到后搜索数组。如果计算的索引小于0,则将搜索整个数组

如果你想知道,here's how WebKit implements it

EncodedJSValue JSC_HOST_CALL arrayProtoFuncIndexOf(ExecState* exec)
{
    // 15.4.4.14
    JSObject* thisObj = exec->hostThisValue().toThis(exec, StrictMode).toObject(exec);
    unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
    if (exec->hadException())
        return JSValue::encode(jsUndefined());

    unsigned index = argumentClampedIndexFromStartOrEnd(exec, 1, length);
    JSValue searchElement = exec->argument(0);
    for (; index < length; ++index) {
        JSValue e = getProperty(exec, thisObj, index);
        if (exec->hadException())
            return JSValue::encode(jsUndefined());
        if (!e)
            continue;
        if (JSValue::strictEqual(exec, searchElement, e))
            return JSValue::encode(jsNumber(index));
    }

    return JSValue::encode(jsNumber(-1));
}

答案 1 :(得分:1)

不能保证数组中项目的性质或顺序,你不能做得比O(n)好,所以它会遍历数组。即使它是跨CPU的实际搜索并行(不知道firefox或chrome是否这样做,但他们可以),它不会改变CPU数量有限的时间复杂度。

答案 2 :(得分:-2)

在ECMA6中,您拥有Set(),然后您可以执行以下操作:

var obj = new Set();
obj.add(1);
obj.has(1) === true;
obj.has(2) === false;

has的表现是O(1)。