Algoritmo para classificar pares de números

14

Eu já fiz essa pergunta no stackoverflow , mas talvez seja mais adequado para este site.

O problema é:

Eu tenho N pares de números inteiros não assinados. Eu preciso classificá-los. O vetor final dos pares deve ser classificado de forma não decrescente pelo primeiro número em cada par e não cada vez mais pelo segundo em cada par. Cada par pode ter o primeiro e o segundo elementos trocados a qualquer momento. Às vezes não há solução, então preciso lançar uma exceção então.

Exemplo:

in pairs:
1 5
7 1
3 8
5 6

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

^^ Sem a troca de pares, é impossível construir a solução. Então trocamos pares (7, 1), (3, 8) e (5, 6) e construímos o resultado. ou

in pairs:
1 5
6 9

out:
not possible

obrigado

editar:

Tom Sirgedas, da SO, propôs a melhor solução . É realmente fácil de implementar e funciona em O (log (n) * n). Obrigado a todos pelas respostas e interesse. Eu realmente gostei da análise mjqxxxx.

Klark
fonte
6
Problema interessante. Sem a troca, é simples, mas com a troca não é claro que exista uma solução única.
Dave Clarke
2
Solução única nem sempre existe, com certeza. Ou seja (1, 10), (5, 6). Ambos (1, 10), (5, 6) e (1, 10), (6, 5) estão corretos.
precisa
4
Da próxima vez, inclua um link. stackoverflow.com/questions/5323941/…
Tsuyoshi Ito 16/03
2
Um amigo meu entendeu como uma pergunta em papel-entrevista-teste. Então eu acho que é só por curiosidade :)
Klark
3
(1) Klark, obrigado pela resposta. (2) Não acho que essa questão seja de nível de pesquisa, mas acho que é o escopo que deve ser alterado. Comecei uma discussão sobre meta .
Tsuyoshi Ito

Respostas:

8

Digamos que dois pares e P 2 = ( uma 2 , b 2 ) são compatíveis não-permuta , se eles podem ser colocados em qualquer ordem na lista classificada, sem trocar qualquer um. Isso é verdade se ( a 1a 2b 1b 2 ) ou ( a 2a 1b 2bp1=(a1,b1)p2=(a2,b2)(a1a2b1b2) . Note-se que p 1 e p 2 sejam compatíveis se e não de troca somente se eles sãode dois permuta compatível(uma vez que a ordem parcial satisfaz definidos p 1p 2p * 2p * 1 , em que * indica a operação de permuta de) . Finalmente, p 1 e p 2 sãocompatíveis com uma trocase puderem ser colocados em qualquer ordem na lista classificada com exatamente uma delas trocada. Isso é verdade se p 1 e(a2a1b2b1)p1p2p1p2p2p1p1p2p1 são compatíveis sem troca. Nos demais casos, p 1 e p 2 são simplesmente incompatíveis: eles não podem satisfazer a condição do pedido, independentemente do seu estado de troca.p2p1p2

O problema agora pode ser resolvido da seguinte maneira. Teste todos os pares de pares. Se qualquer par é incompatível, não há solução e podemos lançar uma exceção. Caso contrário, considere o gráfico com nós correspondentes aos pares originais e arestas entre os pares de nós que não são compatíveis com troca única. Cada par de nós deve ter o mesmo estado de troca em qualquer lista classificada corretamente e, portanto, todos os nós em cada componente conectado do gráfico devem ter o mesmo estado de troca. Precisamos determinar se esses estados de troca em todo o componente podem ser atribuídos de forma consistente. Teste todos os pares de nós em cada componente conectado. Se algum par não é compatível com troca não, não há solução e podemos lançar uma exceção. Agora teste todos os pares de componentes conectados (ou seja, para os componentes C1e , testar todos os pares de nós p 1C 1 e p 2C 2 ). Sabemos que cada par de componentes é compatível com pelo menos um swap, mas alguns pares também podem ser compatíveis sem troca (porque cada par de nós não conectados por uma borda é compatível com pelo menos uma troca e também pode ser sem troca). compatível com troca). Considere um gráfico reduzido com nós correspondentes aos componentes conectados e uma aresta entre dois nós se os componentes correspondentes não forem compatíveis com troca não. Existe uma solução para o problema original se, e somente se, este gráfico for de 2 cores. Se não houver 2C2p1C1p2C222-coloring, não há solução, e podemos lançar uma exceção. Se houver um, troque todos os nós em todos os componentes de uma única cor. Agora temos a garantia de que quaisquer dois nós são compatíveis sem troca e, portanto, podemos classificar corretamente a lista de pares usando a ordem parcial definida.

Cada etapa do algoritmo e, portanto, todo o algoritmo, pode ser executada no tempo .O(N2)


ATUALIZAÇÃO: Uma construção muito mais elegante é a seguinte. Se um par de pares não for compatível sem troca, conecte os nós correspondentes com uma aresta (forçando-os a ter cores diferentes em qualquer cor 2). Se um par de pares não for compatível com troca única, conecte os nós correspondentes com uma cadeia de comprimento 2 (forçando-os a ter a mesma cor em qualquer cor 2). Existe uma solução se e somente se o gráfico resultante for de duas cores. Para construir uma solução a partir de uma coloração azul-vermelha do gráfico, troque apenas os pares cujos nós correspondentes são azuis e classifique a lista resultante.

mjqxxxx
fonte
1
Muito obrigado pela resposta. Eu realmente gostei de lê-lo. Verifique a resposta proposta no SO. Embora não se baseie na teoria dos grafos, o que significa que é menos interessante que a sua solução elegante :), é mais rápida. Obrigado pelo seu tempo.
Klark
3

Deixe X (a, b) denotar a variável binária indicando se o par (a, b) deve ser trocado. Considere qualquer par de pares distintos (a, b) e (c, d) e escreva uma restrição binária nas variáveis ​​X (a, b) e X (c, d) que sejam satisfeitas se e somente se os dois pares estiverem em a ordem correta após a execução dos swaps indicados por X (a, b) e X (c, d), respectivamente. A conjunção de todas essas restrições binárias é uma fórmula 2-SAT em n variáveis ​​e cláusulas O (n ^ 2) que é satisfatória se e somente se o problema original tiver uma solução. Isso pode ser verificado no tempo O (n ^ 2).


Quanto à solução original, observe que todas as restrições têm a forma X (a, b) = X (c, d) ou X (a, b)! = X (c, d) (ou então X (a, b) = constante), portanto, um simples algoritmo "mesclar e verificar a bipartidade" funciona:

Comece com cada X sendo o representante do conjunto que contém apenas ele próprio; então, para cada par (X, Y) tal que X = Y é uma restrição, mescle os componentes aos quais X e Y pertencem; e finalmente verifique se o gráfico contratado, em que cada componente é um vértice e alguma aresta une os componentes que contêm X e Y se o relacionamento X! = Y deve ser mantido, é bipartido.

david
fonte
1
X(a,b)=X(c,d)
Então? A relação de equivalência aqui é o fechamento transitivo da relação (a, b) R (c, d) se a <ce eb> d ou vice-versa. Talvez eu não tenha sido completamente explícito, mas isso deve ser óbvio na minha resposta.
david
1
a<cb>dX(a,b)X(c,d)(1,10)(2,5)(3,7)
1
XYX¬Y
1
Você está de brincadeira? Antes de tudo, qualquer relação entre apenas duas variáveis ​​pode ser expressa como uma fórmula 2-SAT. Por exemplo, X = Y é o mesmo que (X implica Y) e (não X implica não Y). Por outro lado, se todas as restrições forem realmente da forma X = Y ou X = não Y, não será necessário executar o algoritmo 2SAT: o algoritmo mais simples "mesclar e verificar a bipartididade" que descrevi anteriormente funciona.
david