У меня есть несколько объектов с приоритетом, который является составным типом и только частично упорядочен . Мне нужно выбрать объекты в порядке приоритета (т.е. каждый раз приносить минимальный предмет). Но вместо того, чтобы произвольно завершать порядок, я бы предпочел, чтобы очередь была стабильной в том смысле, что если имеется более одного минимального элемента, она должна возвращать самый старый в первую очередь.
Есть ли какая-либо структура данных кучи, которая будет работать с частичным упорядочением? Или модификация обычной очереди приоритетов для работы с ней? Обычный выбор для нужного мне алгоритма - простая двоичная или 4-х разрядная куча, но это не работает с частичным упорядочением.
Поддержка значений приоритета:
- Поиск Infima (GLB) и супремумы (LuB). - максимальный такой, что . Вычисление инфимума из значений занимает время . Infimum (и supremum) каждого множества существует.
- Можно определить линейное расширение для частичного упорядочения. Использование его для очереди приоритетов - самый простой выход, поскольку алгоритм работает именно так. Но порядок влияет на производительность, и порядок вставки выглядит так, как будто лучше избегать наихудших случаев.
Кроме того, алгоритм, в котором я хочу использовать это, должен знать минимум всех приоритетов в очереди.
Приоритеты имеют некоторое реальное значение, но могут быть изменены, поэтому не представляется возможным полагаться на другие свойства, которые они могут иметь.
Примечание: двоичные кучи не работают с частичным упорядочением. Предположим, двоичная куча с , и , где и и . Они расположены в таком порядке, поэтому
a (0)
/ \
b (1) c (2)
теперь d вставлен. Следующая свободная позиция - 3, левый потомок , поэтому мы получаем
a (0)
/ \
b (1) c (2)
/
d (3)
Если (что подразумевает из транзитивности, но ничего не говорит о и ) и , то не местами с , потому что оно не меньше. Но на самом деле оно меньше, чем , но не сравнивается с ним, поэтому теперь основной инвариант кучи не выполняется; верх не минимален.
Я подозреваю, что лес куч, в стиле биномиальной кучи, может работать. По сути, важно всегда сравнивать новые значения с корнем и связывать только сопоставимые элементы. Это сделало бы деревья в лесу случайным размером и, таким образом, сделало сложность зависимой от количества взаимно несопоставимых множеств в куче. Я несколько подозреваю, что сложность не может быть исправлена (мы должны продолжать сравнивать, пока не найдем сопоставимый элемент), возможно, я что-то упустил, поэтому я оставляю это открытым.
Примечание. Порядок является частичным, и, хотя существуют способы определения линейных расширений для него, добавление временной метки и использование ее в качестве вторичного критерия не является одним из них. Предположим, что мы присвоили метку времени для каждого и определили порядок как если или ( и . Тогда предположим, что у нас есть различные , , , такие что и . Тогда и≼ ' ≼ ' б в ≼ б б ⋠ т ( ) ≤ т ( б ) б с т ( ) ≤ т ( б ) ≤ т ( с ) с ≤ ≼ ' б б ≼ ' с с ≼ ' , но , поэтому отношение не транзитивно и, следовательно, не является порядком. Этот вид расширения работает только для слабых упорядочений, но не для частичных.
Изменить: я понял, что не только является infimum любого определенного набора, но я на самом деле должен быть в состоянии эффективно получить infimum элементов в очереди. Итак, я сейчас размышляю, поможет ли добавление специальных узлов, содержащих инфу поддеревьев, в какую-то общую структуру кучи.