Черга пріоритетів для частково впорядкованих пріоритетів з інфімою


16

У мене є деякі об'єкти з пріоритетом, які є складним типом і лише частково впорядковані . Мені потрібно вибирати об'єкти в порядку цього пріоритету (тобто щомісяця отримувати мінімальний предмет). Але замість того, щоб довільно виконувати замовлення, я вважаю за краще, якщо б черга була стабільною в сенсі, що якщо є більше одного мінімального елемента, він повинен повернути перший найстаріший.

Чи є якась структура даних купи, яка б працювала з частковим упорядкуванням? Або модифікація чергової черги пріоритетів для роботи з нею? Поширений вибір алгоритму, який мені потрібен, - це проста двійкова або 4-х аркова купа, але це не працює з частковим упорядкуванням.

Підтримка значень пріоритету:

  1. a b b a a ̸ bаббаа⋚̸б
  2. Знаходження інфіми (glb) і верховенства (луб). інф(хi) - максимальний у такий, що ухi . Обчислення мінімальних н значень займає О(н) час. Мінімальний (і супремум) кожного набору існує.
  3. Можна було б визначити лінійне розширення для часткового впорядкування. Використовувати його для черги пріоритетів - це простий вихід, оскільки алгоритм працює таким чином. Але порядок впливає на продуктивність, і порядок вставки виглядає так, як слід найкраще уникати гірших випадків.

Крім того, алгоритм, який я хочу використовувати це, повинен знати максимум усіх пріоритетів у черзі.

Пріоритети мають певне значення в реальному світі, але вони можуть змінюватися, тому, здається, не можна покластися на інші властивості, які вони могли мати.


Примітка: Бінарні купи не працюють з частковим упорядкуванням. Припустимо бінарну купу з а , б і c , де аc і а⋚̸б і а⋚̸c . Вони розташовані в такому порядку, так

     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гагcгбг⋚̸бгба

Я підозрюю, що ліс купи може бути досягнутий у стилі біноміальної купи. В основному важливо завжди порівнювати нові значення з коренем і лише зв'язувати між собою порівнювані елементи. Це зробило б дерева в лісі випадковим розміром і, таким чином, зробило б складність залежною від кількості взаємно незрівнянних наборів у купі. Я дещо підозрюю, що складність неможливо виправити (ми повинні продовжувати порівнювати, поки ми не потрапимо на порівнянний елемент), можливо, я щось пропустив, тому я залишаю це відкритим.


Примітка. Упорядкування є частковим, і хоча існують способи визначення лінійних розширень для нього, додавання часової позначки та використання її як вторинного критерію не є одним із них. Припустимо, ми призначили часову для кожного і визначили впорядкування як iff або ( і . Тоді припустимо, що у нас є різні , , , такі, що і . Тоді іт(а)а'а'баббат(а)т(б)абct(a)t(b)t(c)caabbc , але , тому відношення не є перехідним і тому зовсім не є впорядкуванням. Цей вид розширення працює лише для слабких замовлень, але не для часткових.ca


Редагувати: Я зрозумів, що визначається не лише інфінімальність будь-якого набору, але мені фактично потрібно вміти ефективно отримувати infimum елементів, що знаходяться в черзі. Тому я зараз замислююся про те, чи допоможе додавання спеціальних вузлів, що містять infima підрядів, до якоїсь загальної структури купи.


Чи розглядали Ви індексовану чергу пріоритетів?

@hulkmeister: Чи можете ви поясніть, як індексація черги змушує її працювати з частковим замовленням (ні, звичайна бінарна купа не працює з частковим замовленням)?

1
Моя думка полягала в тому, що коли два елементи є незрівнянними, ви можете використовувати індекс для відстеження порядку вставки. Тож складіть пріоритет із індексом, і у вас є унікальні ключі, які можна порівняти навіть тоді, коли пріоритету немає. Якщо це звучить як те, що ти хочеш, я можу поставити це на повну відповідь.

1
@hulkmeister: Ну, проблема набагато глибша. Коли вставляється новий елемент, черга пріоритетів зазвичай порівнює його з деяким елементом. Але якщо вони незрівнянні, він просто не знає, куди його вставити. І розбір з індексом не спрацює, тому що індекс змінюється і тому, що він, ймовірно, так і не дасть загального впорядкування, відповідного пріоритету.

Чи можете ви навести якийсь приклад цього типу сполук, і коли він є незрівнянним? Чи можна вважати ці «незрівнянні» значення рівними? Якщо так, ви можете зберігати їх у тому ж самому вузлі в порядку вставки.

Відповіді:


3

Хоча точна проблема, поставлена ​​в оригінальному питанні, здається складною (і мені було б цікаво вирішити цю проблему, особливо частину пошуку інфіми). Я просто хотів зазначити, що якщо частково впорядкований набір дійсно складається з векторів, що використовують замовлення на продукт, і якщо цього достатньо лише мати гарантію, що черга пріоритету повертає значення в порядку, "сумісному" з частковим порядком ( тобто менші елементи завжди повертаються перед більшими елементами), тоді є досить простий спосіб зробити це.

По суті, ідея полягає у пошуку топологічного упорядкування частково упорядкованого набору. Тобто загальний порядок ' ' такий, що . Для векторів, що використовують замовлення товару, це досить просто: просто використовуйте лексикографічний порядок ' ', де перший "компонент" - це сума всіх компонентів, що використовуються для замовлення товару (решта компонентів по суті довільна, щоб ви могли також дотримуватися слабкого порядку). Тоді ми можемо побачити, що і abTS a < babaTbSa = b

а<бi(аiбi) і i(аi<бi)(iаi)<(iбi)аSб
а=бi(аi=бi)(iаi)=(iбi)аSб,
і таким чином що . Таким чином, ми можемо використовувати це замовлення з чергою з пріоритетом і бути впевненими, що більш дрібні елементи (у порядку товару) завжди будуть витягнуті перед більшіми елементами.абаSб

Є ще багато варіантів. Використовуючи одну з складових, мінімальну, максимум, будь-яку лінійну комбінацію, принаймні, з негативними коефіцієнтами. Вибір розширення впливає на швидкість роботи алгоритму накладання.
Ян Худек

2

Що не так у тому, щоб завершити часткове замовлення?

Але замість того, щоб довільно виконувати замовлення, я вважаю за краще, якщо б черга була стабільною в сенсі, що якщо є більше одного мінімального елемента, він повинен повернути перший найстаріший.

Якщо ви віддаєте перевагу "найстаріший перший", то ваше замовлення фактично завершено; «незрівнянні» предмети можна порівняти за віком.

Додайте позначку часу (або будь-яке інше монотонно зростаюче ціле число) до кожного елемента та використовуйте його, якщо порівняння "реального" неможливе.


3
Це було б чудово, якби можна було зробити лінійне розширення часткового впорядкування. Але це не так. Будемо мати 3 чіткі значення, вставлені в порядку a , b , c , такі, що c ≤ a і b є незрівнянним з будь-яким. Розширення з позначкою часу заповнює ≤ 'b і b ≤' c , тому від транзитивності тепер a має бути менше c , але це суперечить фактичному впорядкуванню.

Можливо, ви сплутали це зі слабким замовленням. При слабкому впорядкуванні незрівнянні елементи утворюють класи еквівалентності, тому можна додати довільні додаткові критерії. Для часткового замовлення ви не можете.

1

EDIT: це здається цікавою проблемою, і я про це трохи дослідив. Я пропоную вам прочитати наступне:

  1. Дарелл Реймонд. Бази даних про часткове замовлення, кандидатські дисертації, Університет Ватерлоо.

Я пропоную вам прочитати цей документ: Даскалакіс, Константинос та ін. "Сортування та вибір у позах." Журнал обчислювальної техніки SIAM 40.3 (2011): 597-622.

Автори представляють тут структуру даних під назвою ChainMerge, яка приймає набір і ланцюгову декомпозицію групи в ланцюги. Розмір структури даних - . Автори представляють алгоритм знаходження мінімумів, який працює в де - верхня межа ширини набору. .. Я думав, може, це цікаво.O ( n q ) O ( w n ) wqО(нq)О(шн)ш

Примітка: попередню наївну відповідь я видалив. Клацніть по редагуванню, щоб побачити це.


0

Моє використання термінології може бути неправильним. Будь ласка, відредагуйте мою відповідь безпосередньо, щоб усунути будь-які проблеми, які ви знайдете.


По-перше, потрібно виявити взаємно незрівнянні набори з входів.

Наприклад, може бути 5 об'єктів a, b, c, d, e, але їх часткове впорядкування утворює два роз'єднані графіки:

  • a ≤ b ≤ c
  • d ≤ e
  • але будь-який із {a, b, c}них незрівнянний ні з одним {d, e}.

Ці взаємно незрівнянні набори потрібно виявити спочатку, перш ніж об’єкти можуть бути збережені у відповідній структурі даних. Це можна зробити за допомогою алгоритму пошуку Union


Для ефективності вставки нового об’єкта необхідно мати ефективний спосіб пошуку "списку існуючих об'єктів, які можна порівняти з цим новим об'єктом".


Тепер, у межах кожного підмножини (відповідно {a, b, c}та {d, e}), мінімуми повинні бути чітко визначені. (Для кожного підмножини може бути один або декілька мінімумів через часткове впорядкування.)

Я бачу це як спрямований ациклічний графік . Намагатися помістити його в купу здається згубним.


Для отримання мінімумів з цієї складеної структури даних наступним кроком є ​​отримання списку всіх мінімумів з усіх підмножин, вибору одного з найраніших часових позначок і видалення та повернення цього об'єкта.


На жаль, я не бачу способу ефективно знайти список порівняних об'єктів.

Частково впорядкований набір дійсно може розглядатися як спрямований ациклічний графік. Але одна, надана таблицею суміжності (фактично функцією), а не списком суміжності. Пошук мінімумів набору, заданих списком суміжності, є простим, але для таблиці суміжності це проблема.

Мінімалі також добре визначені в оригінальному наборі. Я не бачу, як пошук підключених компонентів міг би допомогти, оскільки вони не є повними графіками.

1
Ви, здається, припускаєте, що діаграма Хассе - це ліс одинарних дерев (рівнозначно графіків контурів), але в питанні вже зазначено, що це порядок продукту, тобто багатовимірна решітка.
Пітер Тейлор

0

Проект, над яким я працюю, пов'язаний з подібною проблемою (до речі, я також використовую частковий порядок векторів). У нас вже був квадратичний алгоритм часу для сортування випадково упорядкованого списку, і я розробив алгоритм вставки, спостерігаючи за його поведінкою, коли лише один об’єкт вийшов з ладу. Ми не знаємо, чи це це найшвидша реалізація.

Ось псевдокод.

class PartialOrderPriorityQueue
   q <- empty list
   method insert (n):
     for i <- 0 to (q.length - 1):
       if q[i] <= n:
         t <- q[i]
         q[i] <- n
         n <- t
     q.append(n)

   method pop():
     return q.remove(0)

-1

Звичайна поведінка купи - це додавання нового значення на задню частину, а потім просіювання вгору, тоді як воно порівнює більше, ніж його батьківське.

Якщо ви пишете порівняння, яке повертає однакове для батька і дитини, не є порівнянним випадком, оскільки для батьків більше, ніж для дитини , просіювання все одно закінчиться в потрібній точці.

Чи вважається це достатньо стабільним замовленням для ваших цілей?


Для уточнення візьміть приклад із коментаря: a> b і c не можна порівняти з a або b :

  • a тоді b тоді c => a, b, c ... це вже в купі порядку, і ніколи нічого не рухається в просіюванні
  • b, a, c => a, b, c ... a просіюється до правильного місця, і знову ми в правильному купі
  • a, c, b => a, c, b ... b не може просіяти, тому що це не можна порівняти з c, але це залишає їх у порядку FIFO, як ви запитували
  • c, b, a => c, a, b ... a і b знаходяться у правильному відносному порядку, але жоден не може випереджати c, тому що їх не можна порівняти з ним

Отже, результат залежить від порядку вставки - це, здається, відповідає тому, що ви просите, але я не впевнений, чи це дійсно те, що ви хочете. Якщо це не так, чи могли б ви показати результат, який ви сподівалися побачити?


Гаразд, тому з вашого коментаря (та редагування вашого запитання) ви хочете, щоб "порівнянні" елементи перестрибували "непорівнянні" елементи і знаходили правильне місце під замовленням, якщо воно є. Я запитав про це, бо не знав, як інтерпретувати

якщо деякі елементи незрівнянні, він повертає їх у тому порядку, в який вони були вставлені

(d і b попарно незрівнянні у вашому редагуванні, але ви не хочете їх у тому порядку, в який вони були вставлені).

Наступне моє запитання стосувалося б співвідношення між "порівнянними" та "непорівнянними" елементами, але я бачу, що ви виявили, що вони вектори в порядку продукту (не було зрозуміло, чи деякі елементи попарно - незрівнянний з усім , як NaN, чи що).

Отже, якщо я беру ваш новий приклад і призначаю векторні значення, чи правильно, що це приклад, коли b не можна порівняти ні з чим іншим:

        a (1,1)
      /      \
    b (0,4)   c (3,3)
  /
d (2,2)

і слід сортувати так:

        a (1,1)
      /      \
    d (2,2)   c (3,3)
  /
b (0,4)

?


Я чітко зазначив у запитанні, що це не вийде, тому що я вважав, що маю контр-приклад, але зараз не дуже впевнений у цьому. Чи можете ви довести, що така черга буде звуковою (для deletemin, вставити та оновити також)? І пам’ятайте, що можливо, що ≤ b , але c не можна порівняти (і тому порівнюватиме "рівний" із наведеним вище правилом) ні з одним із них.

Ну, це ще не доказ. Ще не дбайте про порядок і докажіть, що така купа завжди має мінімальний елемент у верхній частині (зверніть увагу: (більше) загальна умова і фактична потреба алгоритму мінімальна вгорі, тому якщо a> b , b приходить першим ).

Насправді я підозрюю, що є зустрічний приклад. Припустимо, a , b і c знаходяться в купі, a ≤ b і a ≤ c , a - верх, b - ліва дитина, c - права дитина. Тепер d приходить, що d ≤ c і незрівнянне з a і b . Він вставляється як дитина з b , не менше і залишається там. Тепер з'являється e, що є c ≤ e (таким чином також a ≤ e ) і незрівнянне з b . Отже, e входить як правильна дитина з bі залишається. Тепер витягти (OK, мінімально), е стає місцями в цьому місці і просівають вниз. Він є незрівнянним з b , але менший ніж c , тому заміняється на c . Тепер витяг c , WRONG , d ≤ c .

Якщо ви знайдете помилку в попередньому коментарі (який повинен був би мати форму нерівності, яка має бути сприйнята через транзитивність, і я її пропустив), у вас все одно буде шанс. Інакше це не спрацює.

1
Гаразд, ще простіший зустрічний приклад. Припустимо, a , b і c знаходяться в купі, a ≤ c , b незмінна з будь-яким. a - це верх, b - ліва дитина, c - права дитина. d надходить так, що d ≤ a (таким чином d ≤ c ) і незрівнянне з b . Наступний вільний слот - це так, як ліва дитина з b і d є незрівнянною, тому він залишається там. Тепер витягніть a , WRONG , d ≤ a . Зауважимо, що чи a ≤ cчи не має значення, ситуація така ж, якби вони були незрівнянні.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.