24.07.2013, 06:23
|
Профессор
|
|
Регистрация: 04.10.2010
Сообщений: 571
|
|
Преобразование первого массива во второй с помощью стандартных функций работы с масси
Массив уникальных айдишников:
[1, 4, 32, 2, 5, 7, 8]
обновленный массив (содержащий незначительные отличия от исходного):
[4, 8, 17, 32, 2, 7, 9, 3]
Нужно, используя стандартные функции работы с массивами push, pop, shift, unshift, splice, преобразовать первый массив во второй наиболее быстрым способом. Отличия между массивами, как правило, в нескольких элементах.
Существуют ли готовые алгоритмы? Ваш вариант?
|
|
24.07.2013, 06:56
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от Shitbox2
|
преобразовать первый массив во второй наиболее быстрым способом
|
С практической точки зрения или с точки зрения сложности алгоритма?
|
|
24.07.2013, 11:52
|
Профессор
|
|
Регистрация: 04.10.2010
Сообщений: 571
|
|
Разумеется, массивы могут быть любыми. По сути во втором массиве добавлены элементы в начало или конец, удалены произвольные элементы или поменялась позиция элемента. Нам надо расшифровать изменения и применить их к первому массиву с помощью обозначенных функций. Желательно не трогать совпадающие элементы, чтобы они не перерисовывались лишний раз.
Стоит уточнить, что к первому массиву у нас нет доступа. Мы его можем менять только через функции (это не функции js это функции стороннего плагина)
Представьте, что первому массиву соответствуют элементы в DOM и если мы, например, удаляем элемент из середины или перетаскиваем элемент на другую позицию не должен перерисовываться весь список.
Последний раз редактировалось Shitbox2, 24.07.2013 в 14:00.
|
|
24.07.2013, 14:06
|
Профессор
|
|
Регистрация: 04.10.2010
Сообщений: 571
|
|
Не очень понимаю, зачем нужна apply?
a1.push(a2);
Разве так работать не будет?
|
|
24.07.2013, 19:29
|
Профессор
|
|
Регистрация: 04.10.2010
Сообщений: 571
|
|
...туплю. Тогда вопрос по-другому, почему работает с apply?
|
|
24.07.2013, 19:55
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от Shitbox2
|
Преобразование первого массива во второй
|
просто взять второй массив нельзя? Зачем все это велосипедирование?
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
24.07.2013, 20:29
|
Профессор
|
|
Регистрация: 04.10.2010
Сообщений: 571
|
|
Цитата:
|
А почему не должно? Второй аргумент разворачивается из массива в цепочку аргументов.
|
Тогда что, вообще, делает apply? Может быть мы о разных функциях?
Цитата:
|
просто взять второй массив нельзя? Зачем все это велосипедирование?
|
Нельзя. push, pop, ... splice это не функции js, это функции стороннего плагина, который работает внутри себя с первым массивом, строит DOM и т.д. Читать первый массив можно, но изменять только через этот плагин.
|
|
25.07.2013, 02:15
|
Аспирант
|
|
Регистрация: 01.04.2013
Сообщений: 58
|
|
Цитата:
|
Тогда что, вообще, делает 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)
|
|
29.07.2013, 07:44
|
Профессор
|
|
Регистрация: 04.10.2010
Сообщений: 571
|
|
Задача решена. 3 дня сидел, не думал, что такой тупой.
До конца прояснил в голове условия: необходимо преобразовать один массив в другой с минимальным количеством перестановок. Так же в конечном массиве могут присутствовать элементы, которых нет в начальном или, наоборот, какие-то отсутствовать. Алгоритм должен быть оптимизирован для ситуаций добавления/удаления/перестановки одного элемента.
Получилось вот что:
http://plnkr.co/edit/clW0aVqzaisUkUo44EOL?p=preview
Сложность от O(3n) до O(4n), т.е. линейная. Меньше всего операций удаления/вставки при отличии в одном элементе, больше всего — когда элементы идут в обратном порядке. Предполагалось, что элементы в массивах уникальны, хотя работает и с одинаковыми (тут особо не тестировал). Если кто-то подскажет вариант с еще меньшим количеством перестановок, будет здорово, но, думаю, меньше уже некуда.
|
|
29.07.2013, 11:08
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от Shitbox2
|
push, pop, ... splice это не функции js, это функции стороннего плагина
|
в таком случае, не проще ли сперва преобразовать в настоящие массивы js, затем сделать как писал Дзен-трансгуманист, а потом одним "махом" заменить?
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
|
|