Tengo una situación, como sigue:Algoritmo para obtener rápidamente una ordenación parcial a través de múltiples listas enlazadas
- I tienen n listas enlazadas doblemente
- Cada lista ha de comenzar un centinela y terminar
- las listas tienen todos la misma principio y nodo final (no es necesario, pero por motivos de simplicidad)
- las listas son homogéneas y pueden compartir elementos
me gustaría encontrar una ordenación parcial de todos los nodos en todas las n listas, comenzando con el nodo comenzando y terminando con, así, el nodo de extremo, de tal manera que cualquier nodo que aparece en nx listas , donde x < n, se ordenarán con respecto a los otros nodos en todas las listas en las que aparece.
Utilización de matrices para proporcionar un conjunto de ejemplo de listas:
first = [a, b, d, f, h, i];
second = [a, b, c, f, g, i];
third = [a, e, f, g, h, i];
Obviamente, una respuesta posible sería [a, b, c, d, e, f, g, h, i], pero otro el orden admisible sería [a, b, d, e, c, f, g, h, i].
Sé que hay es un algoritmo rápido para hacer esto, ¿alguien recuerda cómo funciona o cómo se llama? Ya tengo algunas versiones lentas, pero estoy seguro de que en algún lugar de Knuth hay uno mucho más rápido.
(. Y, antes de preguntar, esto no es para la tarea o proyecto Euler, y no puedo hacer esto más concreto Este es el problema.)
Editar: Estoy relativamente seguro de que el parcial el orden se define solo mientras los puntos finales estén en todas las listas y en las mismas posiciones (comienzo y final). No me opondría a una búsqueda en tiempo lineal para encontrar esos puntos finales, y si no se pueden encontrar, entonces se podría generar un error allí.
¿Cuál sería la respuesta (s) si las listas tuvieran órdenes contradictorias, p. 'first = [a, b]' y 'second = [b, a]'? – antinome
antinome: como se menciona en la edición anterior, prefiero generar un error antes de tiempo si no hay forma de obtener puntos finales válidos. – Corbin