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