숫자 쌍을 정렬하는 알고리즘


14

나는 이미 stackoverflow 에서이 질문을 했지만이 사이트에 더 적합 할 수 있습니다.

문제는:

서명되지 않은 정수의 N 쌍이 있습니다. 정렬해야합니다. 쌍의 끝 벡터는 각 쌍의 첫 번째 숫자에 따라 감소하지 않고 각 쌍의 두 번째 숫자에 의해 증가하지 않아야합니다. 각 쌍은 어느 시점에서든 첫 번째 요소와 두 번째 요소를 교환 할 수 있습니다. 때로는 해결책이 없으므로 예외를 던져야합니다.

예:

in pairs:
1 5
7 1
3 8
5 6

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

^^ 쌍을 바꾸지 않으면 솔루션을 구축 할 수 없습니다. 따라서 쌍 (7, 1), (3, 8) 및 (5, 6)을 바꾸고 결과를 만듭니다. 또는

in pairs:
1 5
6 9

out:
not possible

감사

편집하다:

SO의 Tom Sirgedas가 최상의 솔루션을 제안했습니다 . 구현하기 쉽고 O (log (n) * n)에서 작동합니다. 답변과 관심에 감사드립니다. 나는 mjqxxxx 분석을 정말로 즐겼다.


6
재미있는 문제. 스와핑이 없으면 간단하지만 스와핑으로 고유 한 솔루션이 존재하는지 확실하지 않습니다.
Dave Clarke

2
고유 한 솔루션이 항상 존재하는 것은 아닙니다. 즉 (1, 10), (5, 6). (1, 10), (5, 6) 및 (1, 10), (6, 5) 모두 정확합니다.
Klark

4
다음에 링크를 포함하십시오. stackoverflow.com/questions/5323941/…
이토 쓰요시

2
내 친구 중 한 명이 종이 시험 면접 질문으로 받았습니다. 그래서 나는 그것이 단지 호기심에서 벗어난 것 같아요 :)
Klark

3
(1) 클라크, 답장을 보내 주셔서 감사합니다. (2) 나는이 질문이 연구 수준의 질문이라고 생각하지 않지만 그것이 변경되어야 할 범위라고 생각합니다. 나는 메타에 대한 토론을 시작했다 .
이토 쓰요시

답변:


8

두 쌍의 p 2 = ( a 2 , b 2 ) 는 정렬 된 목록에서 순서를 바꾸지 않고 순서대로 배치 할 수 있으면 스왑이 호환되지 않는다고 가정 하십시오. 이 사실 인 경우 중 어느 하나 ( 12B 1B 2 ) 또는 ( 21B 2Bp1=(a1,b1)p2=(a2,b2)(a1a2b1b2) . 참고로 , P 1 P 2는 노 바꾸면 호환없는 그들 만이 경우두 스왑 호환(보낸 부분 위해 정의를 만족 P 1P 2P * 2P * 1 , * 스왑 동작을 나타낸다) . 마지막으로, p 1 p 2 는정확히 하나가 교체 된 정렬 된 목록에서 순서대로 배치 될 수있는 경우하나의 교체가 가능합니다. 이것이 사실이라면 P * (1)(a2a1b2b1)p1p2p1p2p2p1p1p2p1 는 스왑이 호환되지 않습니다. 나머지 경우 p 1 p 2 는 단순히 호환되지 않습니다. 스왑 상태에 관계없이 주문 조건을 충족시킬 수 없습니다.p2p1p2

이제 문제를 다음과 같이 해결할 수 있습니다. 모든 쌍을 테스트하십시오. 쌍이 호환되지 않으면 해결책이 없으므로 예외가 발생할 수 있습니다. 그렇지 않으면 원래 쌍에 해당하는 노드와 1 스왑 호환 되지 않는 노드 쌍 사이의 모서리가있는 그래프를 고려하십시오 . 이러한 각 노드 쌍은 올바르게 정렬 된 목록에서 동일한 스왑 상태를 가져야하므로 그래프의 연결된 각 구성 요소의 모든 노드는 동일한 스왑 상태를 가져야합니다. 이러한 구성 요소 전체 스왑 상태를 일관되게 할당 할 수 있는지 확인해야합니다. 연결된 각 구성 요소 내의 모든 노드 쌍을 테스트하십시오. 쌍이 호환되지 않는 쌍이면 해결책이 없으므로 예외가 발생할 수 있습니다. 이제 연결된 컴포넌트의 모든 쌍을 테스트합니다 (예 : 컴포넌트 C1그리고 , 모든 노드 쌍 p 1C 1p 2C 2 )을 테스트합니다 . 우리는 각 구성 요소 쌍이 하나 이상의 스왑 호환 가능하다는 것을 알고 있지만 일부 쌍은 스왑 호환이 불가능할 수도 있습니다 (가장자리로 연결되지 않은 각 노드 쌍은 하나 이상의 스왑 호환 가능하기 때문에 스왑 호환 가능). 연결된 구성 요소에 해당하는 노드와 해당 구성 요소가 스왑이 호환 되지 않는 경우 두 노드 사이의 가장자리가있는 그래프를 줄 입니다. 이 그래프가 2 색인 경우에만 원래 문제에 대한 해결책이 있습니다. 2 가 없으면C2p1C1p2C222-색칠, 해결책이 없으며 예외를 던질 수 있습니다. 하나가 있으면 단일 색상의 모든 구성 요소에있는 모든 노드를 교체하십시오. 이제 두 노드 모두 스왑이 호환되지 않으므로 정의 된 부분 순서를 사용하여 쌍 목록을 올바르게 정렬 할 수 있습니다.

알고리즘의 각 단계, 따라서 전체 알고리즘은 시간에 수행 될 수 있습니다 .O(N2)


업데이트 : 훨씬 더 우아한 구성은 다음과 같습니다. 한 쌍의 쌍이 스왑이 호환되지 않는 경우 해당 노드를 가장자리로 연결합니다 (2 색에서 다른 색이되도록 함). 한 쌍의 쌍이 1 스왑 호환이 아닌 경우, 해당 노드를 길이가 2 인 체인으로 연결하십시오 (2 색에서 동일한 색이되도록 함). 결과 그래프가 2 색인 경우에만 해결책이 있습니다. 그래프의 파란색-빨간색으로 솔루션을 구성하려면 해당 노드가 파란색 인 쌍만 교체 한 다음 결과 목록을 정렬하십시오.


1
답변 해 주셔서 감사합니다. 나는 그것을 읽는 것을 정말로 즐겼다. SO에 제안 된 답변을 확인하십시오. 그것은 그래프 이론에 의존하지 않지만 그것은 당신의 우아한 솔루션보다 덜 흥미 롭다는 것을 의미하지만, 더 빠릅니다. 시간 내 주셔서 감사합니다.
Klark

3

X (a, b)가 (a, b) 쌍을 교체해야하는지 여부를 나타내는 이진 변수를 나타냅니다. 별개의 쌍 (a, b) 및 (c, d)를 고려하고 두 쌍이있는 경우에만 만족되는 변수 X (a, b) 및 X (c, d)에 이진 제약 조건을 작성하십시오 X (a, b) 및 X (c, d)로 표시된 스왑을 수행 한 후의 올바른 순서. 이러한 모든 이진 제약 조건의 결합은 원래의 문제에 해결책이있는 경우에만 만족할 수있는 n 개의 변수와 O (n ^ 2) 절의 2-SAT 공식입니다. 시간 O (n ^ 2)에서 확인할 수 있습니다.


원래 솔루션의 경우 모든 제약 조건이 X (a, b) = X (c, d) 또는 X (a, b)! = X (c, d) (또는 그렇지 않으면 X (a, b) = 상수), 따라서 간단한 "이 분성 병합 및 확인"알고리즘이 작동합니다.

각 X는 자체 만 포함 된 세트의 대표로 시작합니다. X = Y가 구속 조건이되도록 모든 쌍 (X, Y)에 대해 X와 Y가 속하는 컴포넌트를 병합하십시오. 마지막으로 각 구성 요소가 하나의 정점이고 일부 경계가 관계 X! = Y가 보유해야하는 경우 X와 Y를 포함하는 구성 요소를 결합하는 계약 그래프가 이분인지 확인합니다.


1
X(a,b)=X(c,d)

그래서? 여기서 동등성 관계는 관계식 (a, b) R (c, d) iff a <c and b> d 또는 그 반대로의 전 이적 폐쇄입니다. 어쩌면 나는 완전히 명시 적이 지 않았지만 이것은 내 대답에서 분명해야합니다.
david

1
a<cb>dX(a,b)X(c,d)(1,10)(2,5)(3,7)

1
XYX¬Y

1
농담 해? 우선, 임의의 두 변수 사이의 관계는 2 SAT 수식으로 표현 될 수있다. 예를 들어, X = Y는 (X는 Y를 의미 함)과 같습니다 (X는 Y를 의미하지 않습니다). 반면에 모든 제약 조건이 실제로 X = Y 또는 X = Y 형식이 아닌 경우 2SAT 알고리즘을 전혀 실행할 필요가 없습니다. 앞에서 설명한보다 간단한 "이중 결합 및 확인"알고리즘이 작동합니다.
david
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.