Sayı çiftlerini sıralamak için algoritma


14

Stackoverflow hakkında bu soruyu zaten sordum , ama belki bu site için daha uygundur.

Problem şu:

N çift işaretsiz tamsayı var. Onları sıralamam lazım. Çiftlerin bitiş vektörü, her çiftteki ilk sayıya gittikçe azalmadan ve her çiftteki ikinci sayıya göre artmayacak şekilde sıralanmalıdır. Her çift, birinci ve ikinci elemanların herhangi bir noktada değiştirilmesini sağlayabilir. Bazen çözüm yoktur, o zaman bir istisna atmam gerekiyor.

Misal:

in pairs:
1 5
7 1
3 8
5 6

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

^^ Çiftleri değiştirmeden çözümü oluşturmak imkansızdır. Böylece (7, 1), (3, 8) ve (5, 6) çiftlerini değiştirip sonucu oluşturuyoruz. veya

in pairs:
1 5
6 9

out:
not possible

Teşekkürler

Düzenle:

SO'dan Tom Sirgedas en iyi çözümü önerdi . Uygulanması gerçekten kolaydır ve O (log (n) * n) içinde çalışır. Yanıtlarınız ve ilginiz için hepinize teşekkür ederim. Gerçekten mjqxxxx analiz zevk.


6
İlginç bir sorun. Takas olmadan basittir, ancak takas ile benzersiz bir çözümün var olduğu açık değildir.
Dave Clarke

2
Benzersiz çözüm her zaman kesin olarak mevcut değildir. Yani (1, 10), (5, 6). Hem (1, 10), (5, 6) hem de (1, 10), (6, 5) doğrudur.
Klark

4
Bir dahaki sefere lütfen bir bağlantı ekleyin. stackoverflow.com/questions/5323941/…
Tsuyoshi Ito

2
Bir arkadaşım bunu kağıt testi-mülakat sorusu olarak aldı. Sanırım bu sadece meraktan :)
Klark

3
(1) Klark, Cevabınız için teşekkür ederim. (2) Bu sorunun araştırma düzeyinde bir soru olduğunu düşünmüyorum, ancak sanırım değiştirilmesi gereken kapsam bu. Meta hakkında bir tartışma başlattım .
Tsuyoshi Ito

Yanıtlar:


8

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

C1C2p1C1p2C222- renklendirme, çözüm yok ve bir istisna atabiliriz. Bir tane varsa, tek bir rengin tüm bileşenlerindeki tüm düğümleri değiştirin. Artık herhangi bir iki düğümün takas-olmayan uyumlu olduğu garanti edilmektedir ve bu nedenle, tanımlanan kısmi sıralamayı kullanarak çift listesini düzgün bir şekilde sıralayabiliyoruz.

O(N2)


GÜNCELLEME: Çok daha zarif bir yapı şöyledir. Bir çift çift takas uyumlu değilse, ilgili düğümleri bir kenara bağlayın (herhangi bir 2 renkte farklı renkler olmaya zorlar). Bir çift çift takas uyumlu değilse, ilgili düğümleri 2 uzunluğunda bir zincire bağlayın (herhangi bir 2 renkte aynı renk olmaya zorlayın). Sadece sonuçtaki grafik 2-renklendirilebilir ise ve sadece bir çözüm vardır. Grafiğin mavi-kırmızı renklendirilmesinden bir çözüm oluşturmak için, yalnızca karşılık gelen düğümleri mavi olan çiftleri değiştirin, ardından sonuç listesini sıralayın.


1
Cevabınız için çok teşekkür ederim. Bunu okumaktan gerçekten keyif aldım. SO'da önerilen cevabı kontrol edin. Her ne kadar zarif çözümünüzden daha az ilginç olduğu anlamına gelen grafik teorisine dayanmasa da, daha hızlıdır. Zaman ayırdığınız için teşekkür ederim.
Klark

3

X (a, b) çiftinin (a, b) değiştirilip değiştirilmeyeceğini belirten ikili değişkeni göstermesine izin verin. Herhangi bir çift (a, b) ve (c, d) çiftini göz önünde bulundurun ve X (a, b) ve X (c, d) değişkenlerine yalnızca ve bu iki çiftin olması durumunda tatmin olan bir ikili kısıtlama yazın. sırasıyla X (a, b) ve X (c, d) ile gösterilen swapları yaptıktan sonra doğru sıralama. Tüm bu ikili kısıtlamaların birleşimi, n değişkenleri ve O (n ^ 2) yan tümcelerinde 2-SAT formülüdür ve yalnızca orijinal sorunun bir çözümü varsa tatmin edilebilir. Bu O (n ^ 2) zamanında kontrol edilebilir.


Orijinal çözüme gelince, tüm kısıtlamaların X (a, b) = X (c, d) veya X (a, b)! = X (c, d) (veya X (a, b) = sabit), bu nedenle basit bir "iki taraflılığı birleştirme ve kontrol etme" algoritması çalışır:

Her X'in yalnızca kendisini içeren setin temsilcisi olmasıyla başlayın; daha sonra her bir çift (X, Y) için, X = Y bir kısıtlama olacak şekilde, X ve Y'nin ait olduğu bileşenleri birleştirin; ve son olarak, her bir bileşenin bir tepe noktası olduğu ve bazı kenarların X! = Y ilişkisinin tutması gerekiyorsa, X ve Y içeren bileşenlere katıldığı, sözleşmeli grafiğin iki taraflı olduğunu kontrol edin.


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

Yani? Buradaki denklik ilişkisi, (a, b) R (c, d) i <c ve b> d veya viceversa ilişkisinin geçişli kapanmasıdır. Belki de tamamen açık değildim, ama bu benim cevabımdan belli olmalı.
david

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

1
XYX¬Y

1
Dalgamı geçiyorsun? Her şeyden önce, sadece iki değişken arasındaki herhangi bir ilişki 2-SAT formülü olarak ifade edilebilir. Örneğin, X = Y (X, Y anlamına gelir) ve (X değil, Y anlamına gelmez) ile aynıdır. Öte yandan, tüm kısıtlamalar gerçekten de X = Y veya X = Y biçiminde değilse, o zaman 2SAT algoritmasını çalıştırmaya gerek yoktur: daha önce açıkladığım daha basit "birleştirme ve iki taraflılık kontrolü" algoritması.
david
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.