संख्याओं के जोड़े को सॉर्ट करने के लिए एल्गोरिदम


14

मैं पहले से ही यह प्रश्न पूछा stackoverflow , लेकिन शायद यह बेहतर इस साइट के लिए अनुकूल है।

यह समस्या है:

मेरे पास अहस्ताक्षरित पूर्णांकों के जोड़े हैं। मुझे उन्हें छांटने की जरूरत है। जोड़े के अंत वेक्टर को प्रत्येक जोड़ी में पहले नंबर से और प्रत्येक जोड़ी में दूसरे द्वारा गैर-स्पष्ट रूप से बिना किसी क्रम के छांटना चाहिए। प्रत्येक जोड़ी में किसी भी बिंदु पर स्वैप किए गए पहले और दूसरे तत्व हो सकते हैं। कभी-कभी कोई समाधान नहीं होता है, इसलिए मुझे एक अपवाद फेंकने की आवश्यकता है।

उदाहरण:

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

धन्यवाद

संपादित करें:

एसओ पर टॉम सिरगेडस ने सबसे अच्छा समाधान प्रस्तावित किया । ओ (लॉग (एन) * एन) में लागू करना और काम करना वास्तव में आसान है। उत्तर और रुचि के लिए आप सभी का धन्यवाद। मैंने वास्तव में mjqxxxx विश्लेषण का आनंद लिया।


6
दिलचस्प समस्या है। स्वैपिंग के बिना यह सीधा है, लेकिन स्वैपिंग के साथ यह स्पष्ट नहीं है कि एक अनूठा समाधान मौजूद है।
डेव क्लार्क

2
अद्वितीय समाधान हमेशा सुनिश्चित करने के लिए मौजूद नहीं है। Ie (1, 10), (5, 6)। दोनों (1, 10), (5, 6) और (1, 10), (6, 5) सही हैं।
क्लार्क

4
अगली बार कृपया एक लिंक शामिल करें। stackoverflow.com/questions/5323941/…
त्सुयोशी इतो

2
मेरे एक मित्र को यह पेपर-टेस्ट-साक्षात्कार प्रश्न के रूप में मिला। तो मुझे लगता है कि यह सिर्फ जिज्ञासा से बाहर है :)
क्लार्क

3
(1) क्लार्क, उत्तर के लिए धन्यवाद। (२) मुझे नहीं लगता कि यह प्रश्न एक शोध-स्तर का प्रश्न है, लेकिन मुझे लगता है कि यह वह गुंजाइश है जिसे बदलना चाहिए। मैंने मेटा पर एक चर्चा शुरू की ।
१२:३२ पर त्सुकोशी इतो

जवाबों:


8

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

C1C2p1C1p2C222-कॉलिंग, कोई समाधान नहीं है, और हम एक अपवाद फेंक सकते हैं। यदि एक है, तो एक ही रंग के सभी घटकों में सभी नोड्स स्वैप करें। अब हम गारंटी देते हैं कि कोई भी दो नोड्स नो-स्वैप संगत हैं, और इसलिए हम परिभाषित आंशिक क्रम का उपयोग करके जोड़े की सूची को ठीक से सॉर्ट कर सकते हैं।

O(N2)


अद्यतन: एक बहुत अधिक सुंदर निर्माण निम्नलिखित है। यदि जोड़े की जोड़ी नो-स्वैप संगत नहीं है, तो संबंधित नोड्स को किनारे से जोड़ दें (उन्हें किसी भी 2-रंग में अलग-अलग रंगों के लिए मजबूर करना)। यदि जोड़े की एक जोड़ी एक-स्वैप संगत नहीं है, तो संबंधित नोड्स को लंबाई 2 की श्रृंखला के साथ कनेक्ट करें (उन्हें किसी भी 2-रंग में एक ही रंग होने के लिए मजबूर करें)। एक समाधान है अगर और केवल अगर परिणामी ग्राफ 2-colorable है। ग्राफ के एक नीले-लाल रंग से एक समाधान का निर्माण करने के लिए, बस उन जोड़े को स्वैप करें जिनके संबंधित नोड्स नीले हैं, फिर परिणामी सूची को सॉर्ट करें।


1
जवाब देने के लिए आपका बहुत-बहुत धन्यवाद। इसे पढ़ने में सचमुच मुझे मज़ा आया। एसओ पर प्रस्तावित उत्तर की जांच करें। यद्यपि यह ग्राफ सिद्धांत पर भरोसा नहीं करता है, जिसका अर्थ है कि यह कम दिलचस्प है फिर आपका सुरुचिपूर्ण समाधान :), यह तेज है। आपके समय के लिए शुक्रिया।
क्लार्क

3

आइए X (ए, बी) बाइनरी वैरिएबल को दर्शाते हैं कि क्या जोड़ी (ए, बी) को स्वैप किया जाना चाहिए। अलग जोड़े (ए, बी) और (सी, डी) के किसी भी जोड़े पर विचार करें और चर एक्स (ए, बी) और एक्स (सी, डी) पर एक द्विआधारी बाधा लिखें जो संतुष्ट है और केवल अगर दो जोड़े में हैं एक्स (ए, बी) और एक्स (सी, डी) द्वारा इंगित स्वैप करने के बाद क्रमशः सही क्रम। इस तरह के सभी बाइनरी बाधाओं का संयोजन n चर और O (n ^ 2) खंडों में 2-SAT सूत्र है जो मूल समस्या का समाधान होने पर ही और यदि संतोषजनक हो तो। इसे समय O (n ^ 2) में चेक किया जा सकता है।


मूल समाधान के रूप में, बस ध्यान दें कि सभी बाधाएं फॉर्म एक्स (ए, बी) = एक्स (सी, डी) या एक्स (ए, बी) के हैं! = एक्स (सी, डी) (या अन्य एक्स (ए)! बी) = स्थिर), इसलिए एक सरल "द्विअर्थीपन के लिए विलय और जांच करें" एल्गोरिथ्म काम करता है:

प्रत्येक एक्स के सेट के लिए प्रतिनिधि होने के साथ ही शुरू करें; फिर हर जोड़ी (एक्स, वाई) के लिए जैसे कि एक्स = वाई एक बाधा है, घटकों को मर्ज करें जिसमें एक्स और वाई हैं; और अंत में जांच लें कि अनुबंधित ग्राफ, जहां प्रत्येक घटक एक शीर्ष है और कुछ किनारे एक्स और वाई के घटकों को जोड़ते हैं, संबंध X! = Y को पकड़ना चाहिए, द्विदलीय है।


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

इसलिए? यहाँ समतुल्यता सम्बन्ध संबंध (, बी) आर (सी, डी) के सकर्मक बंद होने का है यदि if <a c और b> d या वाइसवर्स है। शायद मैं पूरी तरह से स्पष्ट नहीं था, लेकिन यह मेरे उत्तर से स्पष्ट होना चाहिए।
डेविड

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 नहीं)। दूसरी ओर, यदि सभी अड़चनें वास्तव में एक्स = वाई या एक्स = वाई के रूप में नहीं हैं, तो 2 एसएटी एल्गोरिथ्म को चलाने की कोई आवश्यकता नहीं है: सरल "मर्ज और द्विध्रुवीयता के लिए जांच" एल्गोरिथ्म मैंने इन कार्यों का वर्णन किया है।
डेविड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.