Thuật toán sắp xếp các cặp số


14

Tôi đã hỏi câu hỏi này trên stackoverflow , nhưng có lẽ nó phù hợp hơn với trang web này.

Vấn đề là:

Tôi có N cặp số nguyên không dấu. Tôi cần sắp xếp chúng. Vectơ kết thúc của các cặp nên được sắp xếp không giới hạn theo số thứ nhất trong mỗi cặp và không tăng theo số thứ hai trong mỗi cặp. Mỗi cặp có thể có các yếu tố thứ nhất và thứ hai hoán đổi tại bất kỳ điểm nào. Đôi khi không có giải pháp, vì vậy tôi cần phải ném một ngoại lệ sau đó.

Thí dụ:

in pairs:
1 5
7 1
3 8
5 6

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

^^ Nếu không trao đổi cặp thì không thể xây dựng giải pháp. Vì vậy, chúng tôi trao đổi các cặp (7, 1), (3, 8) và (5, 6) và xây dựng kết quả. hoặc là

in pairs:
1 5
6 9

out:
not possible

Cảm ơn

biên tập:

Tom Sirgedas trên SO đề xuất giải pháp tốt nhất . Nó thực sự dễ thực hiện và hoạt động trong O (log (n) * n). Cảm ơn tất cả các câu trả lời và quan tâm. Tôi thực sự rất thích phân tích mjqxxxx.


6
Vấn đề thú vị. Không có sự hoán đổi đó là điều đơn giản, nhưng với việc hoán đổi thì không rõ có một giải pháp duy nhất tồn tại.
Dave Clarke

2
Giải pháp độc đáo không phải lúc nào cũng tồn tại. Tức là (1, 10), (5, 6). Cả (1, 10), (5, 6) và (1, 10), (6, 5) đều đúng.
Klark

4
Lần sau xin vui lòng bao gồm một liên kết. stackoverflow.com/questions/5323941/ cường
Tsuyoshi Ito

2
Một người bạn của tôi đã nhận nó dưới dạng câu hỏi phỏng vấn trên giấy. Vì vậy, tôi đoán nó chỉ là sự tò mò :)
Klark

3
(1) Klark, Cảm ơn bạn đã trả lời. (2) Tôi không nghĩ rằng câu hỏi này là một câu hỏi cấp độ nghiên cứu, nhưng tôi đoán rằng đó là phạm vi nên được thay đổi. Tôi bắt đầu một cuộc thảo luận về meta .
Tsuyoshi Ito

Câu trả lời:


8

p1= =(một1,b1)p2= =(một2,b2)(một1một2b1b2)(một2một1b2b1)p1p2p1p2p2*p1**p1p2p1*p2p1p2

C1C2p1C1p2C2). Chúng tôi biết rằng mỗi cặp thành phần ít nhất tương thích một lần hoán đổi, nhưng một số cặp cũng có thể tương thích không trao đổi (vì mỗi cặp nút không được kết nối bởi một cạnh đều tương thích ít nhất một lần hoán đổi và cũng có thể không trao đổi tương thích). Xem xét biểu đồ rút gọn với các nút tương ứng với các thành phần được kết nối và cạnh giữa hai nút nếu các thành phần tương ứng không tương thích không trao đổi. Có một giải pháp cho vấn đề ban đầu khi và chỉ khi biểu đồ này là22-Màu sắc, không có giải pháp, và chúng ta có thể ném một ngoại lệ. Nếu có một, sau đó trao đổi tất cả các nút trong tất cả các thành phần của một màu. Bây giờ chúng tôi được đảm bảo rằng bất kỳ hai nút nào đều không tương thích trao đổi và vì vậy chúng tôi có thể sắp xếp chính xác danh sách các cặp bằng cách sử dụng thứ tự từng phần được xác định.

Ôi(N2) thời gian .


CẬP NHẬT: Một công trình thanh lịch hơn nhiều là sau đây. Nếu một cặp các cặp không tương thích không trao đổi, hãy kết nối các nút tương ứng với một cạnh (buộc chúng phải có màu khác nhau trong bất kỳ 2 màu nào). Nếu một cặp các cặp không tương thích một lần hoán đổi, hãy kết nối các nút tương ứng với một chuỗi có độ dài 2 (buộc chúng phải có cùng màu trong bất kỳ 2 màu nào). Có một giải pháp khi và chỉ khi đồ thị kết quả là 2 màu. Để xây dựng một giải pháp từ màu xanh đỏ của biểu đồ, chỉ trao đổi các cặp có nút tương ứng là màu xanh, sau đó sắp xếp danh sách kết quả.


1
Cảm ơn bạn rất nhiều cho bạn trả lời. Tôi thực sự rất thích đọc nó. Kiểm tra câu trả lời được đề xuất trên SO. Mặc dù nó không dựa vào lý thuyết đồ thị, điều đó có nghĩa là nó ít thú vị hơn so với giải pháp tao nhã của bạn :), nhưng nó nhanh hơn. Cảm ơn bạn đã dành thời gian.
Klark

3

Đặt X (a, b) biểu thị biến nhị phân cho biết liệu cặp (a, b) có nên được hoán đổi hay không. Xem xét bất kỳ cặp cặp riêng biệt nào (a, b) và (c, d) và viết một ràng buộc nhị phân trên các biến X (a, b) và X (c, d) được thỏa mãn khi và chỉ khi hai cặp nằm trong thứ tự đúng sau khi thực hiện các giao dịch hoán đổi được chỉ định bởi X (a, b) và X (c, d), tương ứng. Sự kết hợp của tất cả các ràng buộc nhị phân như vậy là một công thức 2-SAT trong n biến và các mệnh đề O (n ^ 2) thỏa đáng khi và chỉ khi vấn đề ban đầu có giải pháp. Điều này có thể được kiểm tra trong thời gian O (n ^ 2).


Đối với giải pháp ban đầu, chỉ cần lưu ý rằng tất cả các ràng buộc có dạng X (a, b) = X (c, d) hoặc X (a, b)! = X (c, d) (hoặc khác X (a, b) = hằng số), do đó, thuật toán "hợp nhất và kiểm tra tính lưỡng cực" đơn giản hoạt động:

Bắt đầu với mỗi X là đại diện cho tập hợp chỉ chứa chính nó; sau đó với mọi cặp (X, Y) sao cho X = Y là một ràng buộc, hợp nhất các thành phần mà X và Y thuộc về; và cuối cùng kiểm tra xem biểu đồ được ký hợp đồng, trong đó mỗi thành phần là một đỉnh và một số cạnh tham gia các thành phần có chứa X và Y nếu mối quan hệ X! = Y phải giữ, là lưỡng cực.


1
X(một,b)= =X(c,d)

Vì thế? Mối quan hệ tương đương ở đây là sự đóng cửa bắc cầu của mối quan hệ (a, b) R (c, d) iff a <c và b> d hoặc viceversa. Có thể tôi không hoàn toàn rõ ràng, nhưng điều này nên rõ ràng từ câu trả lời của tôi.
david

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

1
XYX¬Y

1
Bạn đang giỡn hả? Trước hết, bất kỳ mối quan hệ nào giữa hai biến chỉ có thể được biểu thị dưới dạng công thức 2-SAT. Ví dụ, X = Y giống như (X ngụ ý Y) và (không X ngụ ý không phải Y). Mặt khác, nếu tất cả các ràng buộc thực sự có dạng X = Y hoặc X = không phải Y, thì không cần phải chạy thuật toán 2SAT: thuật toán "hợp nhất và kiểm tra lưỡng cực" đơn giản hơn mà tôi đã mô tả trước đây.
David
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.