EDIT:我不确定我原来的问题是否足够清楚。我需要一种算法来计算将数组从一个顺序重新排列为另一个顺序的最小移动序列。众所周知,两个数组将包含相同的元素(没有重复)并且具有相同的长度。例如:
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);
Now hashes.before
and hashes.after
包含元素 ID 的无序列表和有序列表。重新排序列表时,到目前为止,最昂贵的操作实际上是移动 DOM 元素。我一直这样做:
var c = $('#container-id');
$(els).each(function() {
c.append(this);
});
这可行,但速度比必要的慢,因为平均来说,只有 2 或 3 个元素真正需要移动。所以,我需要一种算法来计算将数组从一个顺序重新排列到另一个顺序的最小移动序列(在这种情况下,操作于hashes.before
and hashes.after
)。任何人都可以建议一个或提供任何想法吗?
到目前为止,我已经尝试了几种通用的“diff”算法,但它们并没有真正给我我想要的东西。我想我需要的就是这样,但更专业。