当用作哈希时,JavaScript数组的大O是多少?

Ale*_*sco 14 javascript hash big-o hashtable

当用作哈希时,JavaScript的数组访问的大O是什么?

例如,

var x= [];
for(var i=0; i<100000; i++){
   x[i.toString()+'a'] = 123; // using string to illustrate x[alpha]
}
alert(x['9999a']); // linear search?
Run Code Online (Sandbox Code Playgroud)

人们可以希望JS引擎不会在内部使用线性搜索O(n),但这是肯定的吗?

Dan*_*llo 13

在语法中,访问JavaScript中的对象属性和数组元素是在恒定时间内完成的:O(1).ECMAScript规范不保证性能特征,但所有现代JavaScript引擎都在恒定时间内检索对象属性.

这是一个简单的示例,显示了当容器大x1000倍时访问时间的增长情况:

var largeObject = {};
var smallObject = {};

var x, i;

for (i = 0; i < 1000000; i++) {
   largeObject['a' + i] = i;
}

for (i = 0; i < 1000; i++) {
   smallObject['b' + i] = i;
}

console.time('10k Accesses from largeObject');
for (i = 0; i < 10000; i++) x = largeObject['a' + (i % 1000000)];
console.timeEnd('10k Accesses from largeObject');

console.time('10k Accesses from smallObject');
for (i = 0; i < 10000; i++) x = largeObject['a' + (i % 1000)];
console.timeEnd('10k Accesses from smallObject');
Run Code Online (Sandbox Code Playgroud)

Firebug,Firefox 3.6.10(Mac OS X 10.6.4 - 2.93Ghz Intel Core 2 Duo)中的结果:

10k Accesses from largeObject: 22ms
10k Accesses from smallObject: 19ms
Run Code Online (Sandbox Code Playgroud)

Chrome Dev Tools 6.0.472中的结果:

10k Accesses from largeObject: 15ms
10k Accesses from smallObject: 15ms
Run Code Online (Sandbox Code Playgroud)

Windows 7上带有Firebug Lite的Internet Explorer 8.0.7600

10k Accesses from largeObject: 250ms
10k Accesses from smallObject: 219ms
Run Code Online (Sandbox Code Playgroud)

  • 我不知道IE团队如何能够忍受这种令人尴尬的结果...... (4认同)
  • 你能指出ECMAScript或JavaScript规范中的段落,它说保证访问数组元素或对象属性是O(1)吗?AFAIK,JScript具有完全符合标准的O(n)对象实现作为简单链接列表. (2认同)
  • O(1)是平均情况.哈希表的最坏情况是O(n). (2认同)

gbl*_*zex 8

首先,阵列实际上是哈希.永远.这就是原因x[5] === x["5"]:

var x = [];
x[5] = 10;
alert( x[5] === x["5"] ); // true
Run Code Online (Sandbox Code Playgroud)

对象是哈希,而数组只是特殊对象.如果你想使用一般哈希去对象.Javascript中的"关联数组"是对象.数组用于数字索引数据.阵列具有length属性和阵列状的方法,如push,pop,sort等,它们是没有意义要在散列使用.

至于在对象中搜索的大O:它依赖实现.

可能是你可以做的两件最好的事情:

  1. 检查一些浏览器实现的源代码

  2. 为大n做一些基准并得出结论


语言规范的相关部分:

4.3.3对象

对象是属性的集合,并且具有单个原型对象.

8.6.2对象内部属性和方法

数组对象的[[DefineOwnProperty]]内部方法的实现略有不同.数组对象对特定类的属性名称进行特殊处理.

  • 不,它们是哈希值,因为它们将属性视为字符串(您可以在引用的规范中阅读).我不打算再把它写下来.一切都在那里.你只需要阅读它,并仔细阅读. (3认同)