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.
fuente
Respuestas:
Aunque el problema exacto planteado en la pregunta original parece ser difícil (y estaría interesado en una solución a ese problema, especialmente la parte de búsqueda de infima). Solo quería señalar que si el conjunto parcialmente ordenado de hecho consiste en vectores que utilizan un pedido de producto, y si es suficiente con tener la garantía de que la cola de prioridad devuelve los valores en un orden que es "compatible" con el pedido parcial ( es decir, los elementos más pequeños siempre se devuelven antes que los elementos más grandes), entonces hay una manera bastante fácil de hacerlo.
La idea es esencialmente encontrar un orden topológico del conjunto parcialmente ordenado. Es decir, un orden total ' ' tal que a ≤ b≤T . Para los vectores que usan un pedido de producto, esto es bastante fácil: simplemente use un orden lexicográfico ' ≤ S ', donde el primer "componente" es la suma de todos los componentes utilizados para el pedido del producto (el resto de los componentes son esencialmente arbitrarios, para que también puedas seguir un orden débil). Entonces podemos ver que
a < ba≤b⟹a≤Tb ≤S
y
a = b
fuente
¿Qué hay de malo en completar su pedido parcial?
Si prefiere 'el más antiguo primero', entonces su pedido está efectivamente completado; Los artículos "incomparables" son comparables por edad.
Agregue una marca de tiempo (o cualquier otro número entero de crecimiento monótono) a cada elemento y úselo si la comparación 'real' es imposible.
fuente
EDITAR: esto parece ser un problema interesante, y tuve un poco de investigación al respecto. Te sugiero que leas lo siguiente:
Le sugiero que lea este artículo: Daskalakis, Constantinos, et al. "Clasificación y selección en posets". SIAM Journal on Computing 40.3 (2011): 597-622.
Los autores presentan aquí una estructura de datos llamada ChainMerge que acepta un poset y una descomposición en cadena del poset en cadenas. El tamaño de la estructura de datos es O ( n q ) . Los autores presentan un algoritmo para encontrar las minimas que se ejecutan en O ( w n ) donde w es un límite superior en el ancho del poset. .. Pensé que tal vez esto es interesante.q O(nq) O(wn) w
Nota: eliminé una respuesta ingenua anterior. Haga clic en editar para verlo.
fuente
Mi uso de la terminología puede ser incorrecto. Edite mi respuesta directamente para solucionar cualquier problema que encuentre.
Primero, los conjuntos mutuamente incomparables necesitan ser detectados desde las entradas.
Por ejemplo, puede haber 5 objetos
a, b, c, d, e
, pero su ordenamiento parcial forma dos gráficos desconectados:a ≤ b ≤ c
d ≤ e
{a, b, c}
es incomparable con ninguno de{d, e}
.Estos conjuntos mutuamente incomparables deben detectarse primero, antes de que los objetos puedan almacenarse en una estructura de datos adecuada. Esto se puede hacer con un algoritmo de búsqueda de unión
Para mayor eficiencia, la inserción de un nuevo objeto debe tener una manera eficiente de encontrar "la lista de objetos existentes que son comparables con este nuevo objeto".
Ahora, dentro de cada subconjunto (respectivamente
{a, b, c}
y{d, e}
), los mínimos deben estar bien definidos. (Para cada subconjunto puede haber uno o más mínimos, debido a un pedido parcial).Veo esto como un gráfico acíclico dirigido . Intentar encajarlo en un montón parece desastroso.
Para extraer los mínimos de esta estructura de datos compuesta, el siguiente paso es obtener la lista de todos los mínimos de todos los subconjuntos, elegir el que tenga la marca de tiempo más temprana y eliminar y devolver este objeto.
fuente
Un proyecto en el que estoy trabajando implica un problema similar (por cierto, también estoy usando el orden parcial de los vectores). Ya teníamos un algoritmo de tiempo cuadrático para ordenar una lista ordenada aleatoriamente, y desarrollé un algoritmo de inserción al observar su comportamiento cuando solo un objeto estaba fuera de servicio. No sabemos si esta es o no la implementación más rápida posible.
Aquí hay un pseudocódigo.
fuente
El comportamiento habitual del montón es agregar el nuevo valor a la parte posterior y luego tamizarlo mientras se compara más que su padre.
Si escribe una comparación que devuelve lo mismo para el padre y el hijo, el caso no es comparable , ya que el padre es mayor que el hijo , la separación aún debe terminar en el punto correcto.
¿Eso cuenta como un pedido suficientemente estable para sus propósitos?
Para aclarar, tome el ejemplo de su comentario: a> b , y c no es comparable a una o b :
por lo tanto, el resultado depende del orden de inserción; esto parece coincidir con lo que solicita, pero no estoy seguro de si realmente es lo que desea. Si no es así, ¿podría mostrar el resultado que esperaba ver?
De acuerdo, por su comentario (y la edición de su pregunta), desea elementos "comparables" para saltar los "no comparables" y encontrar el lugar correcto bajo el pedido, si hay uno. Pregunté sobre esto porque no estaba seguro de cómo interpretar
(d y b son incomparables por pares en su edición, pero usted no los quiere en el orden en que se insertaron).
Mi siguiente pregunta habría sido sobre la relación entre los elementos "comparables" y "no comparables", pero veo que ahora has revelado que son vectores en orden de producto (no estaba claro si algunos elementos eran pares) incomparable con todo , como NaN, o qué).
Entonces, si tomo su nuevo ejemplo y asigno valores de vectores, ¿es correcto que este sea un ejemplo en el que b no sea comparable a ninguna otra cosa?
y debería ordenar esto:
?
fuente