Actualmente me encuentro con un problema de clasificación difícil. Tengo una colección de eventos que deben ordenarse uno contra el otro (un comparison sort) y en contra de su posición relativa en la lista.¿Algoritmo de ordenamiento para un problema de ordenamiento sin comparación?
En los términos más simples tengo una lista de eventos que tienen una prioridad (número entero), una duración (segundos) y un tiempo de aparición más temprano que el evento puede aparecer en la lista. Necesito ordenar los eventos según la prioridad, pero ningún evento puede aparecer en la lista antes de su primera aparición. He aquí un ejemplo de (esperemos) que sea más claro:
// Psuedo C# code
class Event { int priority; double duration; double earliestTime ; }
void Example()
{
Event a = new Event { priority = 1, duration = 4.0, earliestTime = 0.0 };
Event b = new Event { priority = 2, duration = 5.0, earliestTime = 6.0 };
Event c = new Event { priority = 3, duration = 3.0, earliestTime = 0.0 };
Event d = new Event { priority = 4, duration = 2.0, earliestTime = 0.0 };
// assume list starts at 0.0 seconds
List<Event> results = Sort(new List<Event> { a, b, c, d });
assert(results[ 0 ] == a); // 4.0 seconds elapsed
assert(results[ 1 ] == c); // 7.0 seconds elapsed
assert(results[ 2 ] == b); // 12.0 seconds elapsed
assert(results[ 3 ] == d); // 14.0 seconds elapsed
}
artículo "b" tiene que ir en último lugar, ya que no se le permite comenzar hasta 6,0 segundos en la lista, por lo que se difiere y "c" recibe ir antes que "b" a pesar de que su prioridad es menor. (Espero que lo anterior explique mi problema, si no me lo diga y lo editaré.)
Mi idea actual es utilizar un insertion sort para administrar el proceso de clasificación. A diferencia de muchos de los otros algoritmos de clasificación comunes, el ordenamiento de inserción decide el orden de la lista de a uno por vez y en orden. Por lo tanto, para cada índice, debería poder encontrar el siguiente evento de prioridad más baja, cuya primera hora de ocurrencia será satisfecha.
Espero encontrar recursos sobre la clasificación de algoritmos y estructuras de datos para ayudarme a diseñar una buena solución para este "tipo" de problema. Mi problema real es en realidad más complejo que esto: clasificación jerárquica, búferes de variables entre eventos, restricciones de tiempo no constantes múltiples, de modo que cuanta más información o ideas, mejor. La velocidad y el espacio no son realmente una preocupación. La precisión en la clasificación y la mantenibilidad del código son una preocupación.
Editar: Aclaraciones (basados en los comentarios)
- Eventos consumen toda su duración (es decir que no hay superposición de eventos permitidos)
- Eventos mosto ocurren en o después de su earliestTime, no pueden ocurrir antes de su hora más temprana.
- Los eventos pueden ocurrir más tarde que su earliestTime si existen eventos de menor prioridad
- Los eventos no se pueden interrumpir
- Hay una duración máxima la suma de todos los eventos que pueden caber en una lista. Esto no se muestra arriba. (En realidad, la duración de todos los eventos será mucho mayor que la duración máxima de la lista de tiempos).
- No puede haber espacios vacíos. (No hay agujeros para tratar de relleno posterior.)
Editar: respuesta
Mientras David Nehme dio la respuesta que he seleccionado, quería señalar que su respuesta es un tipo de inserción en el corazón , y varias otras personas proporcionaron inserciones tipo de respuestas de tipo. Esto confirma para mí que un tipo de inserción especializada es probablemente el camino a seguir. Gracias a todos por sus respuestas.
Pregunta: ¿Se permiten espacios? ¿Querrá llenarlos? es decir, ¿querría a, d, b, c como la solución que asegura que b ocurre en t = 6, en lugar de t = 7? –
# Hay una duración máxima de la suma de todos los eventos que pueden caber en una lista. >> ¿Qué significa esto? Algunos de los eventos no serán programados? –
# No puede haber vacíos. (No hay agujeros para probar y llenar de nuevo.) ¿Se le garantiza que esto es posible? Por ejemplo, solo estos dos eventos. Evento a = nuevo Evento {duration = 4.0, earliestTime = 0.0}; Evento b = nuevo Evento {duration = 5.0, earliestTime = 6.0}; –