2013-02-27 2 views
0

У меня есть n * n * n массив в javascript, в котором мне нужно выполнить LOT доступа.Самый эффективный способ доступа к многомерному массиву в javascript

Мне не нужно обращаться ко всем элементам последовательно, но только в определенных положениях. Я также хочу, если возможно, не выделять всю память ячеек массива до тех пор, пока он не будет использован (иначе это займет сразу несколько МБ памяти).

Я ищу наиболее эффективный способ сделать это. Я попытался использовать dictionnary, проиндексированный встроенным ключом (x + '#' + y + '#' + z), но он не достаточно эффективен.

Не могли бы вы предложить другие эффективные способы достижения этого?

+1

Что не так с 'yourArray [0] [1] [2]'? –

+2

@RocketHazmat Это явно недостаточно эффективно ....;) – jondavidjohn

+0

Подход словаря недостаточно эффективен? У меня плохие новости для вас: нет лучшего способа доступа к данным (по крайней мере, в целом). Кстати: в настоящее время несколько компьютеров памяти не имеют ** ничего для компьютеров. : D – freakish

ответ

1

У меня нет более быстрого способа доступа к объектам, чем словарный метод, потому что это то, что на самом деле все в Javascript. Для того, чтобы не выделять память, вы можете использовать объект вместо массива:

var x = {}; 
var key = x + '#' + y + '#' + z; 
x[key] = 'some value'; 

Это, по крайней мере, дать вам ваше беспокойство памяти, но я не уверен, что это действительно большая проблема. (Кроме того, я даже не уверен, что если вы используете массив, он будет выделять память, потому что я не знаком с распределением памяти в Javascript).

+0

Вопрос в том, как именно эта память выделяется тогда в словаре. Это может быть намного лучше с массивами, если они упакованы и доступны не слишком случайным образом. – Bergi

+0

И как они представлены в ОЗУ? Там очень много различий, даже если массивы действуют как экземпляр объекта. Кроме того, многомерный поиск (независимо от того, массив или объект) сильно отличается от одномерного, как вы предложили. – Bergi

+0

Я не знаю, как они представлены в ОЗУ. Можете ли вы связать меня с обсуждением этого вопроса? Это было бы действительно интересно. Кроме того, на основе его описания я не думаю, что он действительно нуждается в многомерном поиске, так как он сказал, что ему не нужно смотреть на него последовательно, только в определенных точках. –

0

Я думаю, что ваш многомерный массив отлично работает. Если он будет разрешен, он не будет полностью уничтожать память и действовать скорее как простой «словарь» - вы также можете использовать вложенные объекты. Тем не менее, я бы предположил, что вложенный поиск будет быстрее, чем в огромном словаре, поскольку хэш-функция становится проще с меньшими ключами. Кроме того, загрузка или повторение полного массива из самого внутреннего измерения будет заметно быстрее, чем запрос каждого отдельного элемента из огромного словаря.

В конце концов, если вы действительно не испытываете каких-либо существенных проблем с производительностью, используйте то, что вам легче писать/читать/использовать.

+0

Если я получил свою математику правильно для n = 1000, если вы поместили логическое значение в массив [n-1] [n-1] [n-1], вы выделили 3814 МБ – naugtur

+0

Как это? Я не думаю, что для 3 объектов с 3 свойствами потребуется более нескольких десятков байтов. – Bergi

+0

Неплохо, я подсчитал это с предположением, что вы заполняете все массивы одним элементом и не указали это четко, так или иначе, var a = []; a [1000] = true' должен заполнить 1001 * 4 байта памяти – naugtur

Смежные вопросы