Какой большой массив O для JavaScript используется при хешировании?

Что большой массив для доступа к массиву JavaScript при использовании в качестве хэша?

Например,

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?

Можно надеяться, что JS-двигатели не будут использовать линейный поиск внутри O (n), но это точно?

Ответ 1

Доступ к свойствам объекта и элементам массива в 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');

Результаты в 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

Результаты в Chrome Dev Tools 6.0.472:

10k Accesses from largeObject: 15ms
10k Accesses from smallObject: 15ms

Internet Explorer 8.0.7600 с Firebug Lite в Windows 7

10k Accesses from largeObject: 250ms
10k Accesses from smallObject: 219ms

Ответ 2

В первую очередь Массивы на самом деле хеши. Всегда. Поэтому x[5] === x["5"]:

var x = [];
x[5] = 10;
alert( x[5] === x["5"] ); // true

Объекты - хеши, а массивы - только специальные объекты. Если вы хотите использовать общие хэши для объектов. "Ассоциативные массивы" в Javascript - это объекты. Массивы предназначены для численных индексированных данных. Массивы имеют свойство length и подобные Array методы, такие как push, pop, sort и т.д., Что не имеет смысла использовать в хэшах.

Что касается большого O для поиска в объектах: он зависит от реализации.

Вероятно, 2 лучших вещи, которые вы можете сделать:

  • Проверьте исходный код некоторых реализаций браузера

  • Сделайте несколько тестов для большого n и сделайте свой вывод


Связанная часть спецификации языка