Алгоритм сортування пар чисел


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 запропонував найкраще рішення . Це реально просто реалізувати і працює в O (log (n) * n). Дякую всім за відповіді та інтерес. Мені дуже сподобався аналіз mjqxxxx.


6
Цікава проблема. Без заміни це просто, але з заміною не зрозуміло, що існує унікальне рішення.
Дейв Кларк

2
Унікальне рішення не завжди існує точно. Тобто (1, 10), (5, 6). Обидва (1, 10), (5, 6) і (1, 10), (6, 5) правильні.
Кларк

4
Наступного разу, будь ласка, включіть посилання. stackoverflow.com/questions/5323941/…
Tsuyoshi Ito

2
Один мій друг отримав це як запитання з тестовим інтерв'ю на папері. Тож я здогадуюсь, що це просто цікаво :)
Кларк

3
(1) Кларк, дякую за відповідь. (2) Я не вважаю, що це питання є питанням рівня дослідження, але я думаю, що саме сферу слід змінити. Я розпочав дискусію з мета .
Цуйосі Іто

Відповіді:


8

p1=(a1,b1)p2=(a2,b2)(a1a2b1b2)(a2a1b2b1)p1p2p1p2p2p1p1p2p1p2p1p2

C1C2p1C1p2C222-кольорова, рішення не існує, і ми можемо кинути виняток. Якщо такий є, то поміняйте місцями всі вузли у всіх компонентах одного кольору. Зараз ми гарантуємо, що будь-які два вузли не сумісні без заміни, і тому ми можемо правильно сортувати список пар, використовуючи визначений частковий порядок.

O(N2)


ОНОВЛЕННЯ: Набагато більш елегантною є наступна конструкція. Якщо пара пар не сумісна без заміни, з'єднайте відповідні вузли кромкою (змушуючи їх бути різними кольорами в будь-якому двоколірному кольорі). Якщо пара пар не сумісна з однією заміною, з'єднайте відповідні вузли ланцюжком довжиною 2 (змушуючи їх бути однаковим кольором у будь-якій двоколірності). Є рішення, якщо і лише тоді, коли отриманий графік є двоколірним. Щоб побудувати рішення із синьо-червоного забарвлення графіка, поміняйте місцями лише ті пари, відповідні вузли яких є синіми, та сортуйте отриманий список.


1
Дуже дякую за вашу відповідь. Мені дуже сподобалось її читати. Перевірте відповідь, запропоновану на SO. Хоча вона не покладається на теорію графів, а це означає, що вона менш цікава, ніж ваше елегантне рішення :), це швидше. Спасибі за ваш час.
Кларк

3

Нехай X (a, b) позначає двійкову змінну, яка вказує, чи слід замінити пару (a, b). Розглянемо будь-яку пару різних пар (a, b) і (c, d) і запишіть бінарне обмеження для змінних X (a, b) і X (c, d), яке задовольняється, якщо і тільки якщо дві пари знаходяться в правильний порядок після виконання свопів, зазначених X (a, b) та X (c, d) відповідно. Сполучення всіх таких бінарних обмежень - це формула 2-SAT у n змінних та O (n ^ 2), яка задовольняє тоді і лише тоді, коли вихідна проблема має рішення. Це можна перевірити в часі O (n ^ 2).


Що стосується оригінального рішення, просто зауважте, що всі обмеження мають вигляд X (a, b) = X (c, d) або X (a, b)! = X (c, d) (або ще X (a, б) = константа), тому простий алгоритм "злиття та перевірка на двосторонність" працює:

Почніть з того, щоб кожен X був представником для набору, що містить тільки себе; то для кожної пари (X, Y) такої, що X = Y є обмеженням, зробіть компоненти, до яких належать X і Y; і нарешті перевірте, що контрактний графік, де кожен компонент є однією вершиною, а деяке ребро приєднується до компонентів, що містять X і Y, якщо співвідношення X! = Y має дотримуватися, є двостороннім.


1
X(a,b)=X(c,d) повинен утримувати", це не відношення еквівалентності для пар, я не думаю.
mjqxxxx

Так? Тут відношення еквівалентності - це перехідне закриття відношення (a, b) R (c, d) iff a <c і b> d або viceversa. Можливо, я був не зовсім явний, але це повинно бути очевидно з моєї відповіді.
Девід

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

1
ХYХ¬Y .
mjqxxxx

1
Ви жартуєте? Перш за все, будь-яка залежність між лише двома змінними може бути виражена формулою 2-SAT. Наприклад, X = Y те саме, що (X означає Y) і (не X означає не Y). З іншого боку, якщо всі обмеження справді мають вигляд X = Y або X = не Y, то взагалі не потрібно запускати алгоритм 2SAT: простіший алгоритм "злиття та перевірка на двосторонність", який я описав у попередніх роботах.
Девід
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.