2017-01-18 2 views
1

У меня есть 10000 элементов, и мне нужно создать матрицу из 10000 строк * 10000 столбцов. если бы я использовал один размерный массив, тогда он был бы огромным. Кроме того, я хочу установить некоторые значения в ячейку (i, j), где 0 < i, j < 10000, поэтому было бы много итераций.Каков наилучший способ хранения/чтения большой матрицы в JavaScript?

Я не мог придумать какую-либо идею. Итак, каков наилучший способ сделать это в узле/javascript?

+0

Не могли бы Вы описать то, что матрица используется для, какие операции вы обычно делаете с ним и как часто, какие плотности есть данные и т.д.? –

+0

@RomanHocke Это рейтинговая матрица системы рекомендаций, основанная на позиции. Я пытался разработать такую ​​систему, используя набор данных movielens с почти 10000 фильмами. – arslan

ответ

3

Все примеры будут представлять следующую матрицу, где 0 не означает никакого значения:

| - - - - - - - | 
| 0 | 0 | 2 | 4 | 
| - - - - - - - | 
| 1 | 0 | 0 | 3 | 
| - - - - - - - | 
| 0 | 2 | 4 | 6 | 
| - - - - - - - | 
| 5 | 0 | 2 | 0 | 
| - - - - - - - | 

Если вам нужны все ячейки в памяти, так что вы должны держать 2D массив размером 10000 х 10000, Я не вижу способа обойти это.

Вариант 1 Пример (строки & смещ_по_столбцам равны нулю основе):

var matrix = [[0,0,2,4],[1,0,0,3],[0,2,4,6],[5,0,2,0]]; 

Если нет, то вы можете хранить массив один размер, с объектом, который указывает на данной клетке с помощью x и y свойства, например.

Варианта 2 Примера (строки & смещ_по_столбцев являются 1 на основе для простоты):

var matrix = [ 
    {x: 3, y: 1, value: 2}, 
    {x: 4, y: 1, value: 4}, 
    {x: 1, y: 2, value: 1}, 
    {x: 4, y: 2, value: 3}, 
    {x: 1, y: 3, value: 2}, 
    {x: 2, y: 3, value: 4}, 
    {x: 3, y: 3, value: 6}, 
    {x: 1, y: 4, value: 5}, 
    {x: 3, y: 4, value: 2} 
]; 

Если вам нужно быстрый поиск & доступа, вы можете использовать объект, где имена свойств объекта, например, row индекса и каждое значение свойства является объектом, который имеет индекс column как свойства, а их значение - значение ячейки. Обратите внимание, что свойства объекта представляют собой строки, которые представляют числа, поскольку числа не могут использоваться как имена свойств.

Вариант 3 Пример (строки & смещ_по_столбцам являются 1 на основе для простоты):

var matrix = { 
    '1': { 
     '3': 2, 
     '4': 4 
    }, 
    '2': { 
     '1': 1, 
     '4': 3 
    }, 
    '3': { 
     '2': 2 
     '3': 4, 
     '4': 6 
    }, 
    '4': { 
     '1': 5, 
     '3': 2 
    } 
}; 

// Get value of cell (col: 3, row: 4) 
console.log(matrix['4']['3']); 
// Set value of cell (col: 2, row: 3) 
matrix['3']['2'] = 100; 

// Check if cell (col: 1, row: 1) has value 
var hasValue = matrix['1'] !== undefined && matrix['1']['1'] !== undefined; 
+0

Может быть более конкретным вариантом 3? Благодарю. – arslan

+0

@alim add better examples –

+0

Я решил использовать один размерный массив, который хранит только половину матрицы, так как симметричен. Я рассмотрел все эти варианты, кажется, не очень хороший способ, так что сохранить память должна быть лучше. спасибо :) – arslan

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