Tengo algunos objetos con prioridad que son de tipo compuesto y solo están parcialmente ordenados . Necesito seleccionar los objetos en orden de esta prioridad (es decir, producir un elemento mínimo cada vez). Pero en lugar de completar arbitrariamente el pedido, preferiría que la cola fuera estable en el sentido de que si hay más de un elemento mínimo, debería devolver el más antiguo primero.
¿Existe alguna estructura de datos de montón que funcione con un pedido parcial? ¿O una modificación de la cola de prioridad regular para trabajar con ella? La elección común para el algoritmo que necesito es un binario simple o un montón de 4 arios, pero eso no funciona con un pedido parcial.
Los valores de prioridad soportan:
- Encontrar infima (glb) y suprema (lub). es la máxima tal que . Calcular el valor mínimo de valores toma tiempo. Existe una cantidad mínima (y superior) de cada conjunto.
- Se podría definir una extensión lineal para el ordenamiento parcial. Usarlo para la cola de prioridad es la salida fácil ya que el algoritmo funciona de esa manera. Pero el orden afecta el rendimiento y el orden de inserción parece ser el mejor para evitar los peores casos.
Además, el algoritmo en el que quiero usar esto necesita saber poco de todas las prioridades en la cola.
Las prioridades tienen algún significado en el mundo real, pero están sujetas a cambios, por lo que no parece viable confiar en otras propiedades que podrían tener.
Nota: los montones binarios no funcionan con pedidos parciales. Supongamos un montón binario con , y , donde y y . Están posicionados en ese orden, así que
a (0)
/ \
b (1) c (2)
ahora se inserta d . La siguiente posición libre es 3, el hijo izquierdo de , entonces obtenemos
a (0)
/ \
b (1) c (2)
/
d (3)
Si (que implica de la transitividad, pero no dice nada acerca de y ) y , entonces no se intercambia con , porque no es menor. Pero en realidad es menor que , pero no se compara con él, por lo que ahora el principal montón invariante no se mantiene; La parte superior no es mínima.
Sospecho que se podría hacer funcionar un bosque de montones en cierto modo de montón binomial. Básicamente, es importante comparar siempre los valores nuevos con la raíz y solo vincular elementos comparables. Haría que los árboles en el bosque tuvieran un tamaño aleatorio y, por lo tanto, la complejidad dependería del número de conjuntos mutuamente incomparables en el montón. Sospecho un tanto que la complejidad no se puede solucionar (tenemos que seguir comparando hasta que lleguemos a un elemento comparable) Podría haber pasado algo por alto, así que lo dejo abierto.
Nota: El orden es parcial y, aunque existen formas de definir extensiones lineales para él, agregar una marca de tiempo y usarlo como criterio secundario no es una de ellas. Supongamos que asignamos la marca de tiempo para cada y definimos el orden como iff o ( y . Entonces supongamos que tenemos distintos , , , de modo que y . Entonces ya ≼ ′ a ≼ ′ bb ⋠ a t ( a ) ≤ t ( b ) a b c t ( a ) ≤ t ( b ) ≤ t ( c ) c ≤ a a ≼ , pero , por lo que la relación no es transitiva y, por lo tanto, no es un orden en absoluto. Este tipo de extensión solo funciona para pedidos débiles, pero no parciales.
Editar: me di cuenta de que no solo se define un mínimo de cualquier conjunto, sino que en realidad necesito poder obtener un mínimo de elementos actualmente en la cola de manera eficiente. Así que ahora estoy considerando si ayudaría agregar nodos especiales que contengan infima de subárboles a alguna estructura de montón común.