Algoritmo para ordenar pares de números


14

Ya hice esta pregunta en stackoverflow , pero tal vez sea más adecuada para este sitio.

El problema es:

Tengo N pares de enteros sin signo. Necesito ordenarlos. El vector final de los pares debe clasificarse de manera no decreciente por el primer número de cada par y no cada vez más por el segundo de cada par. Cada par puede tener el primer y el segundo elemento intercambiados en cualquier punto. A veces no hay solución, entonces necesito lanzar una excepción.

Ejemplo:

in pairs:
1 5
7 1
3 8
5 6

out pairs:
1 7     <-- swapped
1 5     
6 5     <-- swapped
8 3     <-- swapped

^^ Sin intercambio de pares es imposible construir la solución. Entonces intercambiamos pares (7, 1), (3, 8) y (5, 6) y construimos el resultado. o

in pairs:
1 5
6 9

out:
not possible

Gracias

editar:

Tom Sirgedas en SO propuso la mejor solución . Es realmente fácil de implementar y funciona en O (log (n) * n). Gracias a todos por las respuestas e interés. Realmente disfruté el análisis mjqxxxx.


66
Interesante problema Sin el intercambio es sencillo, pero con el intercambio no está claro que exista una solución única.
Dave Clarke

2
La solución única no siempre existe con seguridad. Es decir (1, 10), (5, 6). Ambos (1, 10), (5, 6) y (1, 10), (6, 5) son correctos.
Klark

44
La próxima vez por favor incluya un enlace. stackoverflow.com/questions/5323941/…
Tsuyoshi Ito

2
Un amigo mío lo entendió como una pregunta de entrevista de prueba en papel. Así que supongo que es solo por curiosidad :)
Klark

3
(1) Klark, gracias por la respuesta. (2) No creo que esta pregunta sea una pregunta de nivel de investigación, pero supongo que es el alcance lo que debería cambiarse. Comencé una discusión sobre meta .
Tsuyoshi Ito

Respuestas:


8

Digamos que dos pares y p 2 = ( a 2 , b 2 ) no son compatibles con el intercambio si se pueden colocar en cualquier orden en la lista ordenada sin intercambiar ninguno. Esto es cierto si ( a 1a 2b 1b 2 ) o ( a 2a 1b 2bp1=(a1,b1)p2=(a2,b2)(a1a2b1b2)y(a2a1b2b1). Tenga en cuenta que y p 2 son compatibles sin intercambio si y solo si son compatibles con dos intercambios (ya que el orden parcial definido satisface p 1p 2p 2p 1 , donde indica la operación de intercambio) . Finalmente, p 1 y p 2 son compatibles con un intercambio si se pueden colocar en cualquier orden en la lista ordenada con exactamente uno de ellos intercambiado. Esto es cierto si p 1p1p2p1p2p2p1p1p2p1 son compatibles sin intercambio. En los casos restantes, p 1 y p 2 son simplemente incompatibles: no pueden satisfacer la condición del pedido independientemente de su estado de intercambio.p2p1p2

El problema ahora se puede resolver de la siguiente manera. Prueba cada par de pares. Si algún par es incompatible, no hay solución y podemos lanzar una excepción. De lo contrario, considere el gráfico con nodos correspondientes a los pares originales, y los bordes entre esos pares de nodos que no son compatibles con un intercambio. Cada uno de estos pares de nodos debe tener el mismo estado de intercambio en cualquier lista ordenada adecuadamente y, por lo tanto, todos los nodos en cada componente conectado del gráfico deben tener el mismo estado de intercambio. Necesitamos determinar si estos estados de intercambio de todo el componente pueden asignarse de manera consistente. Pruebe todos los pares de nodos dentro de cada componente conectado. Si algún par no es compatible sin intercambio, no hay solución y podemos lanzar una excepción. Ahora pruebe todos los pares de componentes conectados (es decir, para los componentes C1 y , pruebe todos los pares de nodos p 1C 1 y p 2C 2 ). Sabemos que cada par de componentes es al menos compatible con un intercambio, pero algunos pares también pueden no ser compatibles con el intercambio (porque cada par de nodos no conectados por un borde es al menos compatible con un intercambio, y también pueden no ser compatibles) compatible con intercambio). Considere un gráfico reducido con nodos correspondientes a los componentes conectados, y un borde entre dos nodos si los componentes correspondientesnosoncompatibles sin intercambio. Hay una solución al problema original si y solo si este gráfico es 2 -colorable. Si no hayC2p1C1p2C222-color, no hay solución, y podemos lanzar una excepción. Si hay uno, intercambie todos los nodos en todos los componentes de un solo color. Ahora tenemos la garantía de que cualquiera de los dos nodos son compatibles sin intercambio, por lo que podemos ordenar correctamente la lista de pares utilizando el orden parcial definido.

Cada paso en el algoritmo, y por lo tanto el algoritmo completo, se puede realizar en tiempo .O(N2)


ACTUALIZACIÓN: Una construcción mucho más elegante es la siguiente. Si un par de pares no es compatible sin intercambio, conecte los nodos correspondientes con un borde (forzándolos a tener diferentes colores en cualquier color 2). Si un par de pares no es compatible con un intercambio, conecte los nodos correspondientes con una cadena de longitud 2 (forzándolos a ser del mismo color en cualquier color 2). Hay una solución si y solo si el gráfico resultante es de 2 colores. Para construir una solución a partir de una coloración azul-roja del gráfico, intercambie solo aquellos pares cuyos nodos correspondientes sean azules, luego ordene la lista resultante.


1
Muchas gracias por tu respuesta. Me gustó mucho leerlo. Verifique la respuesta propuesta en SO. Aunque no se basa en la teoría de gráficos, lo que significa que es menos interesante que su elegante solución :), es más rápido. Gracias por tu tiempo.
Klark

3

Deje X (a, b) denotar la variable binaria que indica si el par (a, b) debe intercambiarse. Considere cualquier par de pares distintos (a, b) y (c, d) y escriba una restricción binaria sobre las variables X (a, b) y X (c, d) que se satisfaga si y solo si los dos pares están en el orden correcto después de realizar los intercambios indicados por X (a, b) y X (c, d), respectivamente. La conjunción de todas estas restricciones binarias es una fórmula 2-SAT en n variables y cláusulas O (n ^ 2) que es satisfactoria si y solo si el problema original tiene una solución. Esto se puede verificar en el tiempo O (n ^ 2).


En cuanto a la solución original, solo tenga en cuenta que todas las restricciones son de la forma X (a, b) = X (c, d) o X (a, b)! = X (c, d) (o bien X (a, b) = constante), por lo que funciona un algoritmo simple "fusionar y verificar la bipartita":

Comience con cada X como representante del conjunto que solo se contiene a sí mismo; luego, para cada par (X, Y) de modo que X = Y sea una restricción, combine los componentes a los que pertenecen X e Y; y finalmente verifique que el gráfico contraído, donde cada componente es un vértice y algún borde se une a los componentes que contienen X e Y, si la relación X! = Y debe mantenerse, es bipartito.


1
"X(un,si)=X(C,re)debe mantener "no es una relación de equivalencia en pares, no creo."
mjqxxxx

¿Entonces? La relación de equivalencia aquí es el cierre transitivo de la relación (a, b) R (c, d) si a <c y b> do viceversa. Tal vez no fui completamente explícito, pero esto debería ser obvio a partir de mi respuesta.
David

1
Con más precisión, "un<Csi>re"no es una relación de equivalencia en pares, y tampoco implica que X(un,si) debe ser lo mismo que X(C,re)(aunque implica que podrían ser lo mismo). Por ejemplo, considere los pares(1,10), (2,5 5)y (3,7 7).
mjqxxxx

1
¿Cómo es una fórmula 2-SAT? Las cláusulas que no son tautologías o contradicciones parecen serXY o X¬Y.
mjqxxxx

1
¿Estás bromeando? En primer lugar, cualquier relación entre solo dos variables se puede expresar como una fórmula 2-SAT. Por ejemplo, X = Y es lo mismo que (X implica Y) y (no X implica no Y). Por otro lado, si todas las restricciones son de la forma X = Y o X = no Y, entonces no hay necesidad de ejecutar el algoritmo 2SAT en absoluto: el algoritmo más simple de "fusionar y verificar la bipartita" que describí anteriormente funciona.
David
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.