РЕДАКТИРОВАТЬ: Я не уверен, что мой первоначальный вопрос достаточно ясен. Мне нужен алгоритм, который вычислит минимальную последовательность ходов, чтобы переставить массив из одного порядка в другой. Известно, что оба массива будут содержать одинаковые элементы (без дубликатов) и иметь одинаковую длину. Например:
reorder(
['d', 'a', 'c', 'b', 'e'],
['a', 'b', 'c', 'd', 'e']
)
должно вернуть что-то вроде:
[
{move:'d', after:'b'},
{move:'c', after:'b'}
]
, что означает, что сначала я должен переместить элемент «d» после «b», затем «c» после «b», и массив будет в нужном порядке.
Справочная информация: я работаю над проектом (фактически перемещая большую часть функциональности rtgui на клиентскую сторону). Прямо сейчас я работаю над сортировкой. В основном у меня есть список div, которые я хочу отсортировать в произвольном порядке. Я могу получить желаемый заказ следующим образом:
var hashes = {
before: [],
after: [],
};
var els = $('div.interesting-class').toArray();
var len = els.length;
for(var i = 0; i < len; i++) hashes.before.push(els[i].id);
els.sort(getSortComparator());
for(var i = 0; i < len; i++) hashes.after.push(els[i].id);
Теперь hashes.before
и hashes.after
содержат неупорядоченные и упорядоченные списки идентификаторов элементов. При переупорядочении списка самой дорогой операцией на самом деле является перемещение элементов DOM. Я делал это следующим образом:
var c = $('#container-id');
$(els).each(function() {
c.append(this);
});
Это работает, но медленнее, чем необходимо, так как в среднем нужно перемещать только 2 или 3 элемента. Поэтому Мне нужен алгоритм, который вычислит минимальную последовательность ходов, чтобы переставить массив из одного порядка в другой (в данном случае, работающий на hashes.before
и hashes.after
). Кто-нибудь может предложить или дать какие-нибудь идеи?
До сих пор я пробовал несколько универсальных алгоритмов "diff", но они не дали мне того, что я хотел. Я думаю, что мне нужно вот что, но более специализированное.