Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.07.2013, 06:23
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Преобразование первого массива во второй с помощью стандартных функций работы с масси
Массив уникальных айдишников:
[1, 4, 32, 2, 5, 7, 8]

обновленный массив (содержащий незначительные отличия от исходного):
[4, 8, 17, 32, 2, 7, 9, 3]

Нужно, используя стандартные функции работы с массивами push, pop, shift, unshift, splice, преобразовать первый массив во второй наиболее быстрым способом. Отличия между массивами, как правило, в нескольких элементах.

Существуют ли готовые алгоритмы? Ваш вариант?
Ответить с цитированием
  #2 (permalink)  
Старый 24.07.2013, 06:56
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Shitbox2
преобразовать первый массив во второй наиболее быстрым способом
С практической точки зрения или с точки зрения сложности алгоритма?
Ответить с цитированием
  #3 (permalink)  
Старый 24.07.2013, 11:52
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Разумеется, массивы могут быть любыми. По сути во втором массиве добавлены элементы в начало или конец, удалены произвольные элементы или поменялась позиция элемента. Нам надо расшифровать изменения и применить их к первому массиву с помощью обозначенных функций. Желательно не трогать совпадающие элементы, чтобы они не перерисовывались лишний раз.

Стоит уточнить, что к первому массиву у нас нет доступа. Мы его можем менять только через функции (это не функции js это функции стороннего плагина)

Представьте, что первому массиву соответствуют элементы в DOM и если мы, например, удаляем элемент из середины или перетаскиваем элемент на другую позицию не должен перерисовываться весь список.

Последний раз редактировалось Shitbox2, 24.07.2013 в 14:00.
Ответить с цитированием
  #4 (permalink)  
Старый 24.07.2013, 14:06
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Не очень понимаю, зачем нужна apply?

a1.push(a2);
Разве так работать не будет?
Ответить с цитированием
  #5 (permalink)  
Старый 24.07.2013, 19:29
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

...туплю. Тогда вопрос по-другому, почему работает с apply?
Ответить с цитированием
  #6 (permalink)  
Старый 24.07.2013, 19:55
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Shitbox2
Преобразование первого массива во второй
просто взять второй массив нельзя? Зачем все это велосипедирование?
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #7 (permalink)  
Старый 24.07.2013, 20:29
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Цитата:
А почему не должно? Второй аргумент разворачивается из массива в цепочку аргументов.
Тогда что, вообще, делает apply? Может быть мы о разных функциях?

Цитата:
просто взять второй массив нельзя? Зачем все это велосипедирование?
Нельзя. push, pop, ... splice это не функции js, это функции стороннего плагина, который работает внутри себя с первым массивом, строит DOM и т.д. Читать первый массив можно, но изменять только через этот плагин.
Ответить с цитированием
  #8 (permalink)  
Старый 25.07.2013, 02:15
Аспирант
Отправить личное сообщение для edison Посмотреть профиль Найти все сообщения от edison
 
Регистрация: 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)
Ответить с цитированием
  #9 (permalink)  
Старый 29.07.2013, 07:44
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Задача решена. 3 дня сидел, не думал, что такой тупой.

До конца прояснил в голове условия: необходимо преобразовать один массив в другой с минимальным количеством перестановок. Так же в конечном массиве могут присутствовать элементы, которых нет в начальном или, наоборот, какие-то отсутствовать. Алгоритм должен быть оптимизирован для ситуаций добавления/удаления/перестановки одного элемента.

Получилось вот что:
http://plnkr.co/edit/clW0aVqzaisUkUo44EOL?p=preview

Сложность от O(3n) до O(4n), т.е. линейная. Меньше всего операций удаления/вставки при отличии в одном элементе, больше всего — когда элементы идут в обратном порядке. Предполагалось, что элементы в массивах уникальны, хотя работает и с одинаковыми (тут особо не тестировал). Если кто-то подскажет вариант с еще меньшим количеством перестановок, будет здорово, но, думаю, меньше уже некуда.
Ответить с цитированием
  #10 (permalink)  
Старый 29.07.2013, 11:08
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Shitbox2
push, pop, ... splice это не функции js, это функции стороннего плагина
в таком случае, не проще ли сперва преобразовать в настоящие массивы js, затем сделать как писал Дзен-трансгуманист, а потом одним "махом" заменить?
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск