Mam kilka obiektów o priorytecie, które są typu złożonego i są tylko częściowo uporządkowane . Muszę wybierać obiekty w kolejności tego priorytetu (tzn. Za każdym razem uzyskiwać minimalny przedmiot). Ale zamiast arbitralnie realizować zamówienie, wolałbym, aby kolejka była stabilna w takim sensie, że jeśli jest więcej niż jeden minimalny element, powinna zwracać najstarszą jako pierwszą.
Czy istnieje struktura danych sterty, która działałaby przy częściowym uporządkowaniu? Czy modyfikacja zwykłej kolejki priorytetowej do pracy z nią? Częstym wyborem algorytmu, którego potrzebuję, jest prosta sterta binarna lub 4-arytowa, ale to nie działa z częściowym uporządkowaniem.
Wartości priorytetów obsługują:
- Częściowe zamawianie za pomocą operacji . Jest to częściowe uporządkowanie, więc możliwe jest, że a \ preccurlyeq b jest fałszywe, a b \ preccurlyeq a również jest fałszywe. W takim przypadku piszę \ not \ lesseqgtr b .
- Znalezienie infima (glb) i suprema (lub). jest maksymalnym takim, że . Obliczenie minimum wartości zajmuje czas . Istnieje minimum (i supremum) każdego zestawu.
- Można zdefiniować rozszerzenie liniowe dla częściowego uporządkowania. Użycie go w kolejce priorytetowej jest łatwym rozwiązaniem, ponieważ algorytm działa w ten sposób. Ale kolejność wpływa na wydajność, a kolejność wstawiania wygląda najlepiej, aby unikać najgorszych przypadków.
Dodatkowo algorytm, w którym chcę tego używać, musi znać minimum wszystkich priorytetów w kolejce.
Priorytety mają pewne znaczenie w świecie rzeczywistym, ale mogą ulec zmianie, więc nie można polegać na innych właściwościach, które mogą mieć.
Uwaga: Kupy binarne nie działają przy częściowym uporządkowaniu. Załóżmy stertę binarną z , i , gdzie i i . Są one ustawione w tej kolejności, więc
a (0)
/ \
b (1) c (2)
teraz d jest wstawione. Następna wolna pozycja to 3, lewe dziecko , więc otrzymujemy
a (0)
/ \
b (1) c (2)
/
d (3)
Jeśli (co implikuje z przechodniości, ale nic nie mówi o i ) i , to nie zostanie zamienione na , ponieważ to nie jest mniej. Ale tak naprawdę jest mniej niż , ale nie jest z nim porównywany, więc teraz główny niezmiennik sterty nie ma miejsca; góra nie jest minimalna.d ≼ c d b d ⋚ ̸ b d b A
Podejrzewam, że las hałd w stylu dwumianowej hałdy mógłby zostać wykorzystany. Zasadniczo ważne jest, aby zawsze porównywać nowe wartości z rootem i łączyć tylko porównywalne elementy. Spowodowałoby to, że drzewa w lesie miałyby losowy rozmiar, a tym samym złożoność zależałaby od liczby wzajemnie nieporównywalnych zbiorów w hałdzie. Podejrzewam, że złożoności nie da się naprawić (musimy porównywać, aż trafimy na porównywalny element) Mogłem coś przeoczyć, więc zostawiam to otwarte.
Uwaga: Kolejność jest częściowa i chociaż istnieją sposoby na zdefiniowanie rozszerzeń liniowych, dodanie znacznika czasu i użycie go jako kryterium wtórnego nie jest jednym z nich. Załóżmy, że przypisaliśmy znacznik czasu dla każdego i zdefiniowaliśmy kolejność jako i lub ( i . następnie załóżmy, że posiada odrębną , , tak, że i , a następnie i , ale , więc relacja nie jest przechodnia i dlatego w ogóle nie jest porządkiem. Ten rodzaj rozszerzenia działa tylko w przypadku słabych zamówień, ale nie częściowych.
Edycja: Zdałem sobie sprawę, że nie tylko jest najmniej zdefiniowany zestaw, ale tak naprawdę muszę być w stanie efektywnie uzyskać minimum elementów znajdujących się w kolejce. Zastanawiam się więc, czy dodanie specjalnych węzłów zawierających infima poddrzewa do jakiejś wspólnej struktury stosu byłoby pomocne.