EDITAR: No estoy seguro de que mi pregunta original sea lo suficientemente clara. Necesito un algoritmo que calculará la secuencia mínima de movimientos para reorganizar una matriz de una orden a otra. Se sabe que ambas matrices contendrán los mismos elementos (sin duplicados) y tendrán la misma longitud. Por ejemplo:Algoritmo: forma óptima de reorganizar una lista de una orden a otra?
reorder(
['d', 'a', 'c', 'b', 'e'],
['a', 'b', 'c', 'd', 'e']
)
debería devolver algo como:
[
{move:'d', after:'b'},
{move:'c', after:'b'}
]
que indica que debería mover primero el elemento de 'd' para después 'b', a continuación, pasar 'c' para después 'b' y la matriz estará en el orden deseado.
Antecedentes: Estoy trabajando en un proyecto (que se mueve la mayor parte de la funcionalidad en rtgui para el lado del cliente, en realidad). En este momento estoy trabajando en la clasificación. Básicamente, tengo una lista de divs que quiero ordenar en un orden arbitrario. Puedo conseguir el fin deseado de la siguiente manera:
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);
Ahora hashes.before
y hashes.after
contienen la desordenada y ordenó listas de identificadores de elementos. Al reordenar la lista, la operación más cara, de lejos, está moviendo realmente los elementos DOM. Había estado haciendo esto de la siguiente manera:
var c = $('#container-id');
$(els).each(function() {
c.append(this);
});
Esto funciona, pero es más lento de lo necesario, ya que, en promedio, sólo 2 o 3 elementos realmente necesita ser movido. Por lo tanto, Necesito un algoritmo que calculará la secuencia mínima de movimientos para reorganizar una matriz de una orden a otra (en este caso, operando en hashes.before
y). ¿Alguien puede sugerir uno o dar alguna idea?
He probado varios algoritmos de "diff" de uso general hasta ahora, pero en realidad no me dieron lo que quería. Creo que lo que necesito es así, pero más especializado.
Sí, puedo ver cómo hará eso lo que quiero. Parece que también podría pasar a usar la ordenación de la paciencia para el género, ya que eso ordenará la lista y buscará la subsecuencia al mismo tiempo. ¡Gracias! – jnylen