У мене є деякі об'єкти з пріоритетом, які є складним типом і лише частково впорядковані . Мені потрібно вибирати об'єкти в порядку цього пріоритету (тобто щомісяця отримувати мінімальний предмет). Але замість того, щоб довільно виконувати замовлення, я вважаю за краще, якщо б черга була стабільною в сенсі, що якщо є більше одного мінімального елемента, він повинен повернути перший найстаріший.
Чи є якась структура даних купи, яка б працювала з частковим упорядкуванням? Або модифікація чергової черги пріоритетів для роботи з нею? Поширений вибір алгоритму, який мені потрібен, - це проста двійкова або 4-х аркова купа, але це не працює з частковим упорядкуванням.
Підтримка значень пріоритету:
- a ≼ b b ≼ a a ⋚ ̸ b
- Знаходження інфіми (glb) і верховенства (луб). - максимальний такий, що . Обчислення мінімальних значень займає час. Мінімальний (і супремум) кожного набору існує.
- Можна було б визначити лінійне розширення для часткового впорядкування. Використовувати його для черги пріоритетів - це простий вихід, оскільки алгоритм працює таким чином. Але порядок впливає на продуктивність, і порядок вставки виглядає так, як слід найкраще уникати гірших випадків.
Крім того, алгоритм, який я хочу використовувати це, повинен знати максимум усіх пріоритетів у черзі.
Пріоритети мають певне значення в реальному світі, але вони можуть змінюватися, тому, здається, не можна покластися на інші властивості, які вони могли мати.
Примітка: Бінарні купи не працюють з частковим упорядкуванням. Припустимо бінарну купу з , і , де і і . Вони розташовані в такому порядку, так
a (0)
/ \
b (1) c (2)
тепер вставляється d . Наступна вільна позиція - 3, ліва дитина , тому ми отримуємо
a (0)
/ \
b (1) c (2)
/
d (3)
Якщо (що означає від транзитивності, але нічого не говорить про і ) і , то не на , тому що це не менше. Але насправді це менше, ніж , але це не порівняно з ним, тому зараз головна купа інваріант не тримає; верх не мінімальний.d ≼ c d b d ⋚ ̸ b d b a
Я підозрюю, що ліс купи може бути досягнутий у стилі біноміальної купи. В основному важливо завжди порівнювати нові значення з коренем і лише зв'язувати між собою порівнювані елементи. Це зробило б дерева в лісі випадковим розміром і, таким чином, зробило б складність залежною від кількості взаємно незрівнянних наборів у купі. Я дещо підозрюю, що складність неможливо виправити (ми повинні продовжувати порівнювати, поки ми не потрапимо на порівнянний елемент), можливо, я щось пропустив, тому я залишаю це відкритим.
Примітка. Упорядкування є частковим, і хоча існують способи визначення лінійних розширень для нього, додавання часової позначки та використання її як вторинного критерію не є одним із них. Припустимо, ми призначили часову для кожного і визначили впорядкування як iff або ( і . Тоді припустимо, що у нас є різні , , , такі, що і . Тоді і , але , тому відношення не є перехідним і тому зовсім не є впорядкуванням. Цей вид розширення працює лише для слабких замовлень, але не для часткових.
Редагувати: Я зрозумів, що визначається не лише інфінімальність будь-якого набору, але мені фактично потрібно вміти ефективно отримувати infimum елементів, що знаходяться в черзі. Тому я зараз замислююся про те, чи допоможе додавання спеціальних вузлів, що містять infima підрядів, до якоїсь загальної структури купи.