Saya sudah menanyakan pertanyaan ini di stackoverflow , tapi mungkin lebih cocok untuk situs ini.
Masalahnya adalah:
Saya memiliki N pasang bilangan bulat yang tidak ditandatangani. Saya perlu menyortirnya. Vektor akhir dari pasangan harus diurutkan secara tidak menurun dengan angka pertama di setiap pasangan dan tidak meningkat dengan yang kedua di setiap pasangan. Setiap pasangan dapat mengganti elemen pertama dan kedua di titik mana pun. Terkadang tidak ada solusi, jadi saya harus membuang pengecualian.
Contoh:
in pairs:
1 5
7 1
3 8
5 6
out pairs:
1 7 <-- swapped
1 5
6 5 <-- swapped
8 3 <-- swapped
^^ Tanpa bertukar pasangan tidak mungkin untuk membangun solusinya. Jadi kami menukar pasangan (7, 1), (3, 8) dan (5, 6) dan membangun hasilnya. atau
in pairs:
1 5
6 9
out:
not possible
Terima kasih
edit:
Tom Sirgedas on SO mengusulkan solusi terbaik . Sangat mudah untuk diimplementasikan dan bekerja di O (log (n) * n). Terima kasih atas jawaban dan minatnya. Saya sangat menikmati analisis mjqxxxx.
sumber
Jawaban:
Katakanlah bahwa dua pasang dan p 2 = ( a 2 , b 2 ) yang tidak-swap kompatibel jika mereka dapat ditempatkan dalam rangka baik dalam daftar diurutkan tanpa swapping salah satu. Ini benar jika salah satu ( a 1 ≤ a 2 ∧ b 1 ≥ b 2 ) atau ( a 2 ≤ a 1 ∧ b 2 ≥ bp1=(a1,b1) p2=(a2,b2) (a1≤a2∧b1≥b2) . Perhatikan bahwa p 1 dan p 2 ada-swap kompatibel jika dan hanya jika merekadua-swap kompatibel(karena urutan parsial memenuhi didefinisikan p 1 ⪯ p 2 ≡ p * 2 ⪯ p * 1 , di mana * menunjukkan operasi swap) . Akhirnya, p 1 dan p 2 adalahsalah satu-swap kompatibeljika mereka dapat ditempatkan dalam rangka baik dalam daftar diurutkan dengan tepat satu dari mereka bertukar. Ini benar jika p ∗ 1 dan(a2≤a1∧b2≥b1) p1 p2 p1⪯p2≡p∗2⪯p∗1 ∗ p1 p2 p∗1 tidak kompatibel dengan swap Dalam kasus yang tersisa, p 1 dan p 2 sama sekali tidak kompatibel: mereka tidak dapat memenuhi kondisi pesanan terlepas dari keadaan swap mereka.p2 p1 p2
Masalahnya sekarang dapat dipecahkan sebagai berikut. Uji setiap pasang pasangan. Jika ada pasangan yang tidak kompatibel, tidak ada solusi, dan kami bisa melempar pengecualian. Kalau tidak, perhatikan grafik dengan node yang sesuai dengan pasangan asli, dan tepi antara pasangan node yang tidak kompatibel satu-swap. Setiap pasangan node harus memiliki status swap yang sama dalam daftar yang diurutkan dengan benar, dan oleh karena itu semua node di setiap komponen yang terhubung dari grafik harus memiliki status swap yang sama. Kita perlu menentukan apakah status swap seluruh komponen ini dapat ditetapkan secara konsisten. Uji semua pasangan node dalam setiap komponen yang terhubung. Jika ada pasangan yang tidak kompatibel dengan swap, tidak ada solusi, dan kami dapat memberikan pengecualian. Sekarang uji semua pasangan komponen yang terhubung (yaitu, untuk komponenC1 dan , uji semua pasangan node p 1 ∈ C 1 dan p 2 ∈ C 2 ). Kita tahu bahwa setiap pasangan komponen setidaknya satu-swap yang kompatibel, tetapi beberapa pasangan mungkin juga tidak-swap yang kompatibel (karena setiap pasangan node yang tidak terhubung dengan tepi setidaknya satu-swap yang kompatibel, dan mungkin juga tidak ada- swap kompatibel). Pertimbangkan grafik tereduksi dengan node yang sesuai dengan komponen yang terhubung, dan tepi antara dua node jika komponen yang sesuai tidak kompatibel dengan swap. Ada solusi untuk masalah awal jika dan hanya jika grafik ini 2 -warna. Jika tidak ada 2C2 p1∈C1 p2∈C2 2 2 -warna, tidak ada solusi, dan kita bisa melempar pengecualian. Jika ada, maka tukar semua node di semua komponen dalam satu warna. Kami sekarang dijamin bahwa dua node mana pun tidak kompatibel dengan swap, sehingga kami dapat mengurutkan daftar pasangan menggunakan urutan parsial yang ditentukan.
Setiap langkah dalam algoritma, dan karenanya seluruh algoritma, dapat dilakukan dalam waktu .O(N2)
UPDATE: Konstruksi yang jauh lebih elegan adalah sebagai berikut. Jika sepasang pasangan tidak kompatibel dengan swap, sambungkan node yang sesuai dengan tepi (memaksa mereka untuk menjadi warna yang berbeda dalam 2 warna). Jika sepasang pasangan tidak kompatibel satu-swap, sambungkan node yang sesuai dengan rantai panjang 2 (memaksa mereka menjadi warna yang sama dalam setiap 2-pewarnaan). Ada solusi jika dan hanya jika grafik yang dihasilkan 2-colorable. Untuk membuat solusi dari pewarnaan grafik biru-merah, tukar pasangan-pasangan yang simpulnya berwarna biru, lalu urutkan daftar yang dihasilkan.
sumber
Misalkan X (a, b) menunjukkan variabel biner yang menunjukkan apakah pasangan (a, b) harus ditukar. Pertimbangkan pasangan berpasangan yang berbeda (a, b) dan (c, d) dan tulis batasan biner pada variabel X (a, b) dan X (c, d) yang dipenuhi jika dan hanya jika kedua pasangan berada dalam urutan yang benar setelah melakukan swap yang ditunjukkan oleh X (a, b) dan X (c, d), masing-masing. Gabungan dari semua batasan biner tersebut adalah rumus 2-SAT dalam n variabel dan klausa O (n ^ 2) yang memuaskan jika dan hanya jika masalah asli memiliki solusi. Ini dapat diperiksa dalam waktu O (n ^ 2).
Adapun solusi asli, hanya perhatikan bahwa semua kendala adalah dari bentuk X (a, b) = X (c, d) atau X (a, b)! = X (c, d) (atau X (a, b) = konstan), jadi algoritma sederhana "gabungkan dan periksa bipartiteness" berfungsi:
Mulailah dengan masing-masing X menjadi perwakilan untuk set yang hanya berisi dirinya sendiri; kemudian untuk setiap pasangan (X, Y) sedemikian rupa sehingga X = Y adalah kendala, gabungkan komponen-komponen yang dimiliki X dan Y; dan akhirnya memeriksa bahwa grafik yang dikontrak, di mana setiap komponen adalah satu simpul dan beberapa sisi bergabung dengan komponen yang mengandung X dan Y jika hubungan X! = Y harus dipegang, adalah bipartit.
sumber