Каков наиболее эффективный способ объединения [1,2] и [7,8] в [[1,7], [2,8]]
Учитывая 2 массива [1,2] и [7,8], что является наиболее эффективным способом слияния, чтобы сформировать [[1,7], [2,8]]. Я знаю, что мы можем сделать это:
a1 = [1,2], a2 = [7,8], a3=[];
for (var i=0; i<a1.length; i++) {
a3.push([a1[i], a2[i]]);
}
Я имею дело с большим массивом. Поэтому я хочу посмотреть, есть ли лучший способ.
4 ответа
Нет способа сделать это быстрее, чем O(n), потому что к каждому элементу нужно прикоснуться один раз.
Это хороший вопрос!
Прежде всего, убедитесь, что вы назначаете a1,a2,a3
в местном масштабе через var
Ключевое слово, которое, кажется, вы забыли. В противном случае производительность может сильно пострадать.
Что касается сравнения производительности кода. Вы можете проверить / увидеть результаты здесь:
чистый JavaScript:
var a1 = [1, 2],
a2 = [7, 8],
a3 = [];
for (var i = 0; i < a1.length; i++) {
a3.push([a1[i], a2[i]]);
}
JS / родные методы:
var a1 = [1, 2],
a2 = [7, 8],
a3 = [];
a3 = a1.map(function(e, i, a) {
return [e, a2[i]]
})
Конечно, существует больше возможных реализаций, но дело в том, что, вероятно, ни одна другая реализация не сможет превзойти цикл for и прямую упаковку в O (n)-времени, как любезно указал Трэвис Дж.
Двигатель / Оптимизирован: V8 JavaScript Engine через Chrome v29
Вы в основном ищете функцию, идентичную Python zip
функция, так что проверьте ответы на старый вопрос SO:
Нет, это примерно так же эффективно, как и получается. Это работает в O(N) время. На самом деле не так много, вы могли бы спросить. Если есть что-то, что вы можете оптимизировать, это будет преобразовывать a1 в карту, но это оптимизация для памяти, и звучит так, будто вы хотите ускорить процесс.