В настоящее время я столкнулся с трудной проблемой сортировки. У меня есть коллекция событий, которые необходимо отсортировать друг против друга ( сортировка сравнения ) и по их относительному положению в списке.
Проще говоря, у меня есть список событий, каждое из которых имеет приоритет (целое число), длительность (секунды) и самое раннее время появления события, которое может появиться в списке. Мне нужно отсортировать события по приоритету, но ни одно событие не может появиться в списке раньше времени его возникновения. Вот пример (надеюсь) сделать его более понятным:
// 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
}
Элемент "b" должен стоять последним, потому что ему не разрешается запускаться до 6.0 секунд в списке, поэтому он откладывается, и "c" идет до "b", хотя его приоритет ниже. (Надеюсь, вышеизложенное объясняет мою проблему, если нет, дайте мне знать, и я отредактирую ее.)
Моя текущая идея заключается в использовании сортировки вставок для управления процессом сортировки. В отличие от многих других распространенных алгоритмов сортировки, сортировка вставкой определяет порядок списка по одному и по порядку. Таким образом, для каждого индекса я должен быть в состоянии найти следующее событие с самым низким приоритетом, чье самое раннее время возникновения будет удовлетворено.
Я надеюсь найти ресурсы по алгоритмам сортировки и структурам данных, которые помогут мне найти хорошее решение для такого рода проблем. Моя настоящая проблема на самом деле более сложная, чем эта: иерархическая сортировка, переменные буферы между событиями, множество неконстантных временных ограничений, поэтому чем больше информации или идей, тем лучше. Скорость и пространство на самом деле не проблема. Точность сортировки и удобство сопровождения кода являются проблемой.
Редактировать: Разъяснения (по комментариям)
- События потребляют всю свою продолжительность (т. Е. Перекрытие событий не допускается)
- События должны происходить в или после их самого раннего времени, они не могут происходить раньше их самого раннего времени.
- События могут произойти позже их самого раннего времени, если существуют события с более низким приоритетом
- События не могут быть прерваны
- Максимальная продолжительность - сумма всех событий, которые могут поместиться в списке. Это не показано выше. (На самом деле продолжительность всех событий будет намного больше, чем максимальная продолжительность временного списка.)
- Пробелов не должно быть. (Нет отверстий, чтобы попытаться заполнить их обратно.)
Редактировать: Ответ
В то время как Дэвид Нехм дал ответ, который я выбрал, я хотел отметить, что его ответ - это вставка в глубине души, и несколько других людей предоставили вставки для сортировки ответов. Это подтверждает для меня, что специализированная сортировка вставок - это, вероятно, путь. Спасибо всем вам за ваши ответы.