जीसीडी = 1 के साथ सबसे छोटे सबसेट का आकार खोजना


10

यह पोलिश कॉलेजिएट प्रोग्रामिंग प्रतियोगिता 2012 के अभ्यास सत्र से एक समस्या है । हालांकि मैं मुख्य प्रतियोगिता के लिए समाधान पा सकता था, मैं कहीं भी इस समस्या का समाधान नहीं ढूंढ सकता।

समस्या यह है: 10 9 से अधिक नहीं , N अलग-अलग सकारात्मक पूर्णांकों के सेट को देखते हुए , सबसे छोटे सबसेट का आकार m ज्ञात करें जिसका कोई भी सामान्य भाजक नहीं है। 1. N अधिकांश 500 पर है, और एक समाधान मौजूद माना जा सकता है।109mN

m9S|S|=10S1<g1<g2<...<g10gcd(gi,gj)=1एस जी 2 जी 3जी 10 जी 2 जी 3जी 103 × 5 × 7 × 11 × × 29 = 3234846615 > 10 9ijSg2g3...g10g2g3...g103×5×7×11×...×29=3234846615>109 , एक विरोधाभास।

हालाँकि, इस के साथ, एक सीधा जानवर बल अभी भी बहुत धीमा है। क्या किसी के पास कोई दूसरा विचार है?


नहीं कर सकते ? g2=2
वॉनब्रांड

जी 1g2>g12 । 1 नहीं हो सकता है, क्योंकि 9-सबसेट में नहीं हो सकता हैg1
Wakaka

जवाबों:


1

यह समस्या निम्न के बराबर है, और यह दोनों तरीकों से कमी का निर्माण करने के लिए तुच्छ है।

बिट वैक्टर की एक सूची को देखते हुए, उनमें से न्यूनतम संख्या को ऐसे खोजें कि andउनमें से सभी में बिट वेक्टर हो। ( )0()

फिर हम सेट कवर को घटाकर दिखाते हैं । सेट कवर द्वारा, मेरा मतलब है कि के सेट की एक सूची दी गई है , उन सेटों की न्यूनतम संख्या जो आपके संघ को कवर करते हैं।एस 1 , ... , एस कश्मीर()S1,,Sk

हम तत्वों को होने का आदेश देते हैं । चलो है, जहां यदि , 0 अन्यथा। ध्यान दें कि यह फ़ंक्शन एक आपत्ति है, इसलिए इसका उलटा है। एफ ( एस ) = ( 1 - χ एक 1 ( एस ) , ... , 1 - χ एक n ( एस ) ) χ एक्स ( एस ) = 1 एक्स एसa1,,anf(S)=(1χa1(S),,1χan(S))χx(S)=1xS

अब, अगर हम का समाधान पर , और समाधान है , तो कवर सेट करने के लिए समाधान है।( एस 1 ) , ... , ( एस कश्मीर ) { ( एस बी 1 ) , ... , ( एस बी एम ) } { - 1 ( एस बी 1 ) , ... , - 1 ( एस बी एम ) }()f(S1),,f(Sk){f(Sb1),,f(Sbm)}{f1(Sb1),,f1(Sbm)}

इस प्रकार मुझे लगता है कि यह समस्या किसी को खोज की जगह को कम करने की क्षमता का परीक्षण कर रही है।


आपको न्यूनतम शीर्ष कवर कैसे मिलता है?
युवल फिल्मस

ओह इस समाधान nvm, यह बजाय कवर सेट है।
चाओ जू

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

मैं यह नहीं देखता कि प्रश्न में दी गई समस्या (*) के बराबर कैसे है। एक बात के लिए, प्रश्न में दी गई समस्या का यह वादा है कि सभी पूर्णांक , जो कि समस्या (*) में प्रकट नहीं होने वाले बिट वैक्टर के वजन के बारे में एक गारंटी से मेल खाती है। 109
DW

1

सभी युग्मक gcd की गणना करके, डुप्लिकेट को हटाकर, और फिर पुनरावृत्ति करके इसे अपेक्षाकृत कुशलता से हल करना संभव है। इससे पहले कि आप इसे फिर से कुशल बना दें, यह डुप्लिकेट को हटाने का कार्य है।

मैं एल्गोरिथ्म को नीचे और अधिक विस्तार से , लेकिन सबसे पहले, यह एक बाइनरी ऑपरेटर को परिभाषित करने में मदद करता है । यदि धनात्मक पूर्णांक के सेट हैं, तो परिभाषित करेंएस , टीS,T

ST={gcd(s,t):sS,tT}.

ध्यान दें किऔर (आपकी समस्या में); आमतौर पर, उन से किसी से भी छोटा होगा, जो एल्गोरिथ्म को कुशल बनाने में मदद करता है। यह भी ध्यान रखें कि हम कर सकते हैं गणना के साथसरल एन्यूमरेशन द्वारा gcd संचालन।| एस टी | 10 9 एस टी एस टी | एस | × | टी ||ST||S|×|T||ST|109STST|S|×|T|

उस अंकन के साथ, यहाँ एल्गोरिथ्म है। चलो संख्या के इनपुट सेट हो। कंप्यूट , फिर , फिर , और इसी तरह। सबसे छोटी ऐसे खोजें जैसे कि लेकिन । तब आप जानते हैं कि सबसे छोटे ऐसे सबसेट का आकार । यदि आप भी इस तरह के सबसेट का एक ठोस उदाहरण आउटपुट करना चाहते हैं, तो बैक-पॉइंटर्स रखकर आप आसानी से इस तरह के सेट को फिर से संगठित कर सकते हैं।एस 2 = एस 1एस 1 एस 3 = एस 1एस 2 एस 4 = एस 1एस 3 कश्मीर 1 एस कश्मीर 1 एस कश्मीर - 1 कश्मीरS1S2=S1S1S3=S1S2S4=S1S3k1Sk1Sk1k

यह अपेक्षाकृत कुशल होगा, क्योंकि कोई भी मध्यवर्ती सेट आकार में ऊपर नहीं बढ़ता है (वास्तव में, उनका आकार संभवतः उससे बहुत छोटा होगा), और चलने के समय के लिए लगभग जीसीडी संचालन। 500 × ( | एस 1 | + | एस 2 | + )109500×(|S1|+|S2|+)

यहाँ एक अनुकूलन है जो आगे भी दक्षता में सुधार कर सकता है। मूल रूप से, आप सबसे छोटे उपयोग करने के लिए दोहरीकरण का उपयोग कर सकते हैं जैसे कि । विशेष रूप से, प्रत्येक तत्व के लिए , हम में सबसे छोटी सबसेट का ट्रैक रखने जिसका gcd है और जिसका आकार है । (जब आप डुप्लिकेट निकालते हैं, तो आप उस उपसमुच्चय के पक्ष में संबंधों को हल करते हैं जो छोटा होता है।) अब, नौ सेट के अनुक्रम की गणना करने के बजाय, हम पांच सेटों के अनुक्रम की गणना करते हैं। , , फिर , फिर1 एस कश्मीर एक्स एस मैं एस 1 एक्स मैं एस 1 , एस 2 , एस 3 , एस 4 , ... , एस 9 एस 1 , एस 2 , एस 4 , एस 8 , एस 9 एस 2 = एस 1एस 1 एस 4 = एस 2एस 2 एसk1SkxSiS1xiS1,S2,S3,S4,,S9S1,S2,S4,S8,S9S2=S1S1S4=S2S2एस 9 = एस 1 × एस 8 कश्मीर [ 1 , 2 , 4 , 8 , 9 ] 1 एस कश्मीर कश्मीर 1 एस कश्मीर 1 1 एस कश्मीर 1 एस कश्मीरS8=S4S4 , फिर । जैसा कि आप जाते हैं, पहले जैसे कि । एक बार जब आपको ऐसा मिल जैसे कि , तो आप तुरंत रुक सकते हैं: आप सबसे छोटी सबसेट पा सकते हैं, जिसकी gcd से जुड़ी सबसेट को देखकर । तो, आप जैसे ही आप एक समूह तक पहुंच रोक सकता ऐसी है कि जो आप जल्दी बंद करने के लिए यदि आप एक छोटे सबसेट को खोजने के लिए अनुमति देता है,।S9=S1×S8k[1,2,4,8,9]1Skk1Sk11Sk1Sk

यह समय-कुशल और स्थान-कुशल होना चाहिए। स्थान बचाने के लिए, प्रत्येक तत्व , आपको पूरे सेट को संग्रहीत करने की आवश्यकता नहीं है: यह दो बैकपॉइंटर्स को स्टोर करने के लिए पर्याप्त है (इसलिए S_i के दो तत्व जिसे आपने पाने के लिए gcd लिया था ) वैकल्पिक रूप से संबंधित उपसमूह का आकार।एस मैं , एस जे एक्सxSkSi,Sjx

सिद्धांत रूप में, आप किसी अन्य जोड़ श्रृंखला द्वारा अनुक्रम को प्रतिस्थापित कर सकते हैं । मुझे नहीं पता कि कुछ अन्य जोड़ श्रृंखला कोई बेहतर होगी या नहीं। इष्टतम विकल्प सही उत्तरों के वितरण और सेट के अपेक्षित आकार पर निर्भर हो सकता है , जो मेरे लिए स्पष्ट नहीं है, लेकिन संभवतः अनुभव के माध्यम से अनुभवजन्य रूप से प्राप्त किया जा सकता है।एस के[1,2,4,8,9]Sk

क्रेडिट: के प्रत्येक तत्व के साथ संख्या के एक सबसेट के भंडारण के विचार के लिए KWillets मेरे धन्यवाद , जो जल्दी रोक की अनुमति देता है।Si


मेरा मानना ​​है कि द्विआधारी खोज आवश्यक नहीं है; आप प्रत्येक gcd के साथ तत्व गणना को स्टोर कर सकते हैं, और इसे प्रत्येक दोहरीकरण के दौरान न्यूनतम जोड़ी राशि पर सेट कर सकते हैं।
22

महान बिंदु, @KWillets! उस खूबसूरत विचार के लिए धन्यवाद! मैंने इसे अपने उत्तर में शामिल कर लिया है।
डीडब्ल्यू

0

शायद यह तेजी से इसे दूसरे तरीके से देख रहा है ... 2 से 31607 के बीच की कुल गिनती के लिए, सबसे बड़ी संख्या से कम है 31607, बहुत बड़ी संख्या नहीं। 31607 तक के अपराधों पर आपके द्वारा पूरी तरह से बताई गई प्रत्येक संख्या को लिखें: a_i यहाँ 1 या एक बड़ा प्राइम है। तब का एक सेट की अपेक्षाकृत प्रधानमंत्री है इसी यदि वैक्टर रैखिक स्वतंत्र हैं (और उनके अलग या दोनों 1 कर रहे हैं), और आप देख रहे हैं रैंक एक मैट्रिक्स के।109

ai=p1ni1p2ni2Pi
PiainijP

रैखिक स्वतंत्रता से क्या संबंध है? वैक्टर और रैखिक रूप से स्वतंत्र हैं, लेकिन जीसीडी जबकि हम चाहते हैं । (1,1)(1,0)(1,0)(0,0)
युवल फिल्मस Yu

1
रैखिक स्वतंत्रता काम नहीं करती है, लेकिन हम इस प्रमुख अपघटन का एक अलग तरीके से उपयोग कर सकते हैं। प्रत्येक प्राइम ( के और अधिकतम के बीच), को सभी संख्याओं (दिए गए सेट के बीच) के संग्रह के रूप में परिभाषित करें, जिसमें एक कारक के रूप में नहीं है । अब समस्या यह है कि संख्या का एक सबसे छोटा सबसेट जैसे कि प्रत्येक ; । यह हिट सेट समस्या है, सेट कवर समस्या के बराबर। यह अपूर्ण है, लेकिन इस आकार के लिए कुछ कार्यान्वयन काफी तेजी से हो सकते हैं। 3401 p i 500 P i A p p B A p | p| 1 एन पीp3401 pi500 PiAppBAp|ApB|1NP
polkjh

क्या आप मुझे कुछ कार्यान्वयनों के लिए निर्देशित कर सकते हैं जो काम कर सकते हैं? अब तक, मैं केवल सन्निकटन एल्गोरिदम पा सकता हूं। धन्यवाद!
वाकाका

यह सर्वेक्षण पत्र अनुमानित और सटीक दोनों समाधानों को देखता है। और एक टिप्पणी का जवाब देते समय, कृपया टिप्पणी में @ नाम का व्यक्ति जोड़ें। यह उस व्यक्ति को एक सूचना भेजेगा। अन्यथा वे कभी भी आपकी टिप्पणी के बारे में नहीं जान सकते।
पोल्ज्ह

-1

यदि आप gcd (S) = 1 के साथ एक उपसमूह खोजने में सक्षम हैं, तो मैं हमेशा केवल 2 तत्वों के रहने तक निरस्त तत्वों को हटा सकता हूँ, जिनमें gcd (S) = 1. इसलिए, मैं दावा कर सकता हूँ कि या तो सबसे छोटा है सबसेट में 2 तत्व होंगे या यह मौजूद नहीं होगा।

अब, हम इस समस्या को हल करने के लिए पुनरावर्तन का उपयोग करते हैं। चलो संख्याओं को 2 भागों में विभाजित करते हैं, एक n-1 तत्वों के साथ और 1 तत्व (अंतिम तत्व) के साथ। या तो 2 नंबर पहले n-1 तत्वों में होंगे या अंतिम तत्व के साथ जोड़े गए 1 भाग से एक तत्व होगा। इसलिए, हम इस समस्या को हल करने में सक्षम हैं

T (n) = T (n-1) + O (n) समय। जिसका अर्थ है T (n) = O (n ^ 2)।


4
gcd(6,10,15)=1 । आप किस तत्व को निकाल सकते हैं?
रिक डेकर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.