Я бы предложил использовать heapq в python вместо связанного списка. Поскольку вы делаете пользовательское сравнение, вы, вероятно, захотите реализовать что-то вроде того, что описано в heapq с пользовательским предикатом сравнения .
В дополнение к приоритету, добавьте поле, которое содержит время, когда элемент был добавлен в кучу. Затем ваш фактический приоритет является функцией назначенного приоритета и продолжительности времени, в течение которого элемент находился в куче. Например, приоритет может быть что-то вроде:
elapsed_time = current_time - added_time;
real_priority = assigned_priority * elapsed_time;
Возможно, вы захотите сделать множитель некоторой долей прошедшего времени.
Еще одна возможность, если вы хотите убедиться, что что-то не останется в очереди дольше установленного времени. Например, если вы хотите, чтобы вещи не оставались более 5 минут, вы можете добавить поле dequeue_time
. Ваше сравнение становится примерно таким:
// assume items a and b are being compared
if (a.dequeue_time < current_time) {
if (b.dequeue_time < a.dequeue_time) {
// b sorts before a
}
else if (b.dequeue_time > a.dequeue_time) {
// return a sorts before b
}
else { // dequeue times are equal
return result of comparing a.priority to b.priority
}
}
else {
// here, return result of comparing a.priority and b.priority
}
heapq будет намного эффективнее, чем ваш связанный список, особенно с увеличением количества элементов в вашей очереди. Плюс, это уже написано и известно, работает. Все, что вам нужно сделать, это предоставить функцию сравнения.