Eu tenho alguns objetos com prioridade que é do tipo composto e é apenas parcialmente ordenada . Eu preciso selecionar os objetos na ordem desta prioridade (ou seja, produzir itens mínimos a cada vez). Mas, em vez de concluir arbitrariamente o pedido, eu preferiria que a fila fosse estável, no sentido de que, se houver mais de um elemento mínimo, ele retornará o mais antigo primeiro.
Existe alguma estrutura de dados de heap que funcione com pedidos parciais? Ou uma modificação da fila de prioridade regular para trabalhar com ela? A escolha comum para o algoritmo de que eu preciso é um binário simples ou heap de 4 árias, mas isso não funciona com a ordenação parcial.
Os valores de prioridade suportam:
- Pedido parcial usando a operação . É uma ordem parcial, portanto, é possível que a \ preccurlyeq b seja falso e b \ preccurlyeq a também seja falso. Eu escrevo a \ not \ lesseqgtr b nesse caso.a ≼ b b ≼ a a ⋚ ̸ b
- Encontrar infima (glb) e suprema (lub). é o máximo modo que . Calcular o mínimo de valores leva tempo. Existe o mínimo (e supremo) de todos os conjuntos.
- Uma extensão linear para a ordem parcial pode ser definida. Usá-lo para a fila de prioridade é a saída mais fácil, pois o algoritmo funciona dessa maneira. Mas a ordem afeta o desempenho e a ordem de inserção parece ser melhor para evitar os piores casos.
Além disso, o algoritmo em que eu quero usar isso precisa conhecer o mínimo de todas as prioridades na fila.
As prioridades têm algum significado no mundo real, mas estão sujeitas a alterações, portanto, não parece viável confiar em outras propriedades que possam ter.
Nota: pilhas binárias não funcionam com pedidos parciais. Suponha uma pilha binário com , e , onde e e . Eles estão posicionados nessa ordem, então
a (0)
/ \
b (1) c (2)
agora d está inserido. A próxima posição livre é 3, o filho esquerdo de , então obtemos
a (0)
/ \
b (1) c (2)
/
d (3)
Se (o que implica de transitividade, mas não diz nada sobre e ) e , então não se trocado com , porque não menos é. Mas, na verdade, é menor que , mas não é comparado a ele, então agora a invariante principal do heap não se sustenta; top não é mínimo.d ≼ c d b d ⋚ ̸ b d b um
Suspeito que uma floresta de montes um tanto no estilo de pilha binomial possa ser feita para funcionar. Basicamente, é importante sempre comparar novos valores com raiz e vincular apenas elementos comparáveis. Isso tornaria as árvores da floresta de tamanho aleatório e, portanto, tornaria a complexidade dependente do número de conjuntos mutuamente incomparáveis no monte. Suspeito que a complexidade não possa ser corrigida (temos que continuar comparando até encontrarmos um elemento comparável). Talvez eu tenha perdido alguma coisa, então estou deixando isso em aberto.
Nota: A ordem é parcial e, embora haja maneiras de definir extensões lineares para ela, adicionar um carimbo de data e hora e usá-lo como critério secundário não é um deles. Suponha que atribuiu o timestamp para cada e definiu a ordenação como sse ou ( e . em seguida, suponha que temos distinta , , , tal que e . então e , mas , então a relação não é transitiva e, portanto, não é uma ordenação. Esse tipo de extensão funciona apenas para pedidos fracos, mas não parciais.
Edit: eu percebi que não só é o mínimo de qualquer conjunto definido, mas também preciso ser capaz de obter o menor número possível de elementos atualmente na fila com eficiência. Portanto, agora estou pensando se a adição de nós especiais contendo informações de subárvores a alguma estrutura de heap comum ajudaria.