Преобразование первого массива во второй с помощью стандартных функций работы с масси
Массив уникальных айдишников:
[1, 4, 32, 2, 5, 7, 8] обновленный массив (содержащий незначительные отличия от исходного): [4, 8, 17, 32, 2, 7, 9, 3] Нужно, используя стандартные функции работы с массивами push, pop, shift, unshift, splice, преобразовать первый массив во второй наиболее быстрым способом. Отличия между массивами, как правило, в нескольких элементах. Существуют ли готовые алгоритмы? Ваш вариант? |
Цитата:
|
Разумеется, массивы могут быть любыми. По сути во втором массиве добавлены элементы в начало или конец, удалены произвольные элементы или поменялась позиция элемента. Нам надо расшифровать изменения и применить их к первому массиву с помощью обозначенных функций. Желательно не трогать совпадающие элементы, чтобы они не перерисовывались лишний раз.
Стоит уточнить, что к первому массиву у нас нет доступа. Мы его можем менять только через функции (это не функции js это функции стороннего плагина) Представьте, что первому массиву соответствуют элементы в DOM и если мы, например, удаляем элемент из середины или перетаскиваем элемент на другую позицию не должен перерисовываться весь список. |
Не очень понимаю, зачем нужна apply?
a1.push(a2); Разве так работать не будет? |
...туплю. Тогда вопрос по-другому, почему работает с apply?
|
Цитата:
|
Цитата:
Цитата:
|
Цитата:
Цитата:
var a = [1, 2, 3]; a.push([4, 5, 6]); console.log(a); и два примера для сравнения var a = [1, 2, 3]; a.push(4, 5, 6); console.log(a); var a = [1, 2, 3];a.push.apply(a,[4, 5, 6]); console.log(a); синтаксис push array.push( elem1, elem2, ... ) а не array.push( array1, array2, ... ) а в apply можно запихать массив аргументов, с которым будет вызвана функция соответственно a.push.apply(a,[4, 5, 6]) приравнивается к a.push(4, 5, 6) |
Задача решена. 3 дня сидел, не думал, что такой тупой.
До конца прояснил в голове условия: необходимо преобразовать один массив в другой с минимальным количеством перестановок. Так же в конечном массиве могут присутствовать элементы, которых нет в начальном или, наоборот, какие-то отсутствовать. Алгоритм должен быть оптимизирован для ситуаций добавления/удаления/перестановки одного элемента. Получилось вот что: http://plnkr.co/edit/clW0aVqzaisUkUo44EOL?p=preview Сложность от O(3n) до O(4n), т.е. линейная. Меньше всего операций удаления/вставки при отличии в одном элементе, больше всего — когда элементы идут в обратном порядке. Предполагалось, что элементы в массивах уникальны, хотя работает и с одинаковыми (тут особо не тестировал). Если кто-то подскажет вариант с еще меньшим количеством перестановок, будет здорово, но, думаю, меньше уже некуда. |
Цитата:
|
Часовой пояс GMT +3, время: 19:02. |