Каков наиболее эффективный способ объединения [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:

Javascript эквивалент функции zip в Python

Нет, это примерно так же эффективно, как и получается. Это работает в O(N) время. На самом деле не так много, вы могли бы спросить. Если есть что-то, что вы можете оптимизировать, это будет преобразовывать a1 в карту, но это оптимизация для памяти, и звучит так, будто вы хотите ускорить процесс.

Другие вопросы по тегам