Ho alcuni oggetti con priorità di tipo composto ed è solo parzialmente ordinato . Devo selezionare gli oggetti in ordine di questa priorità (ovvero resa minima ogni volta articolo ). Ma piuttosto che completare arbitrariamente l'ordine, preferirei che la coda fosse stabile, nel senso che se c'è più di un elemento minimo, dovrebbe restituire prima il più vecchio.
Esiste una struttura di dati heap che funzionerebbe con l'ordinamento parziale? O una modifica della normale coda di priorità per lavorare con essa? La scelta comune per l'algoritmo di cui ho bisogno è un semplice heap binario o 4-ary, ma non funziona con l'ordinamento parziale.
I valori di priorità supportano:
- L'ordinamento parziale mediante l'operazione a ≼ b è falso e b ≼ a è anche falso. Scrivo un ⋚ ̸ b in quel caso. . È un ordinamento parziale, quindi è possibile che
- È possibile definire un'estensione lineare per l'ordinamento parziale. Usarlo per la coda di priorità è la via d'uscita facile in quanto l'algoritmo funziona in questo modo. Ma l'ordine influenza le prestazioni e l'ordine di inserimento sembra che dovrebbe essere il migliore per evitare i casi peggiori.
Inoltre, l'algoritmo in cui desidero utilizzarlo deve conoscere l'influenza di tutte le priorità in coda.
Le priorità hanno un significato nel mondo reale, ma sono soggette a cambiamenti, quindi non sembra fattibile fare affidamento su altre proprietà che potrebbero avere.
Nota: gli heap binari non funzionano con l'ordinamento parziale. Assumere un mucchio binario con , e , dove e e . Sono posizionati in quell'ordine, quindi
a (0)
/ \
b (1) c (2)
ora viene inserito d . La prossima posizione libera è 3, il figlio sinistro di , quindi otteniamo
a (0)
/ \
b (1) c (2)
/
d (3)
Se (che implica dalla transitività, ma non dice nulla su e ) e , allora non viene scambiato con , perché non è inferiore. Ma in realtà è meno di , ma non è confrontato con esso, quindi ora l'invariante dell'heap principale non regge; la parte superiore non è minima.
Sospetto che una foresta di cumuli in qualche modo nello stile del mucchio binomiale possa funzionare. Fondamentalmente è importante confrontare sempre nuovi valori con root e collegare solo elementi comparabili. Renderebbe gli alberi nella foresta dimensionati casualmente e quindi la complessità dipenderà dal numero di insiemi reciprocamente incomparabili nell'heap. Sospetto in qualche modo che la complessità non possa essere risolta (dobbiamo continuare a confrontare fino a quando non raggiungiamo un elemento comparabile) Potrei aver perso qualcosa, quindi lascio questo aperto.
Nota: l'ordinamento è parziale e mentre ci sono modi per definirne un'estensione lineare, aggiungere un timestamp e usarlo come criterio secondario non è uno di questi. Supponiamo di aver assegnato il timestamp per ogni e definito l'ordinamento come iff o ( et . Quindi supponiamo di avere distinto , , , tale che e . Quindi a ≼ ′ e b ≼ ′ c , ma c ≼ ′ a , quindi la relazione non è transitiva e quindi non è affatto un ordinamento. Questo tipo di estensione funziona solo per ordini deboli, ma non parziali.
Modifica: mi sono reso conto che non solo è definito un infimo di qualsiasi set, ma in realtà devo essere in grado di ottenere in modo efficiente infimo di elementi attualmente in coda. Quindi sto ora valutando se l'aggiunta di nodi speciali contenenti infima di sottostrutture ad una struttura heap comune sarebbe di aiuto.