सभी युग्मक gcd की गणना करके, डुप्लिकेट को हटाकर, और फिर पुनरावृत्ति करके इसे अपेक्षाकृत कुशलता से हल करना संभव है। इससे पहले कि आप इसे फिर से कुशल बना दें, यह डुप्लिकेट को हटाने का कार्य है।
मैं एल्गोरिथ्म को नीचे और अधिक विस्तार से , लेकिन सबसे पहले, यह एक बाइनरी ऑपरेटर को परिभाषित करने में मदद करता है । यदि धनात्मक पूर्णांक के सेट हैं, तो परिभाषित करेंएस , टी⊗S,T
S⊗T={gcd(s,t):s∈S,t∈T}.
ध्यान दें किऔर (आपकी समस्या में); आमतौर पर, उन से किसी से भी छोटा होगा, जो एल्गोरिथ्म को कुशल बनाने में मदद करता है। यह भी ध्यान रखें कि हम कर सकते हैं गणना के साथसरल एन्यूमरेशन द्वारा gcd संचालन।| एस ⊗ टी | ≤ 10 9 एस ⊗ टी एस ⊗ टी | एस | × | टी ||S⊗T|≤|S|×|T||S⊗T|≤109S⊗TS⊗T|S|×|T|
उस अंकन के साथ, यहाँ एल्गोरिथ्म है। चलो संख्या के इनपुट सेट हो। कंप्यूट , फिर , फिर , और इसी तरह। सबसे छोटी ऐसे खोजें जैसे कि लेकिन । तब आप जानते हैं कि सबसे छोटे ऐसे सबसेट का आकार । यदि आप भी इस तरह के सबसेट का एक ठोस उदाहरण आउटपुट करना चाहते हैं, तो बैक-पॉइंटर्स रखकर आप आसानी से इस तरह के सेट को फिर से संगठित कर सकते हैं।एस 2 = एस 1 ⊗ एस 1 एस 3 = एस 1 ⊗ एस 2 एस 4 = एस 1 ⊗ एस 3 कश्मीर 1 ∈ एस कश्मीर 1 ∉ एस कश्मीर - 1 कश्मीरS1S2=S1⊗S1S3=S1⊗S2S4=S1⊗S3k1∈Sk1∉Sk−1k
यह अपेक्षाकृत कुशल होगा, क्योंकि कोई भी मध्यवर्ती सेट आकार में ऊपर नहीं बढ़ता है (वास्तव में, उनका आकार संभवतः उससे बहुत छोटा होगा), और चलने के समय के लिए लगभग जीसीडी संचालन। 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 एसk1∈Skx∈SiS1x≤iS1,S2,S3,S4,…,S9S1,S2,S4,S8,S9S2=S1⊗S1S4=S2⊗S2एस 9 = एस 1 × एस 8 कश्मीर ∈ [ 1 , 2 , 4 , 8 , 9 ] 1 ∈ एस कश्मीर कश्मीर 1 ∈ एस कश्मीर 1 1 एस कश्मीर 1 ∈ एस कश्मीरS8=S4⊗S4 , फिर । जैसा कि आप जाते हैं, पहले जैसे कि । एक बार जब आपको ऐसा मिल जैसे कि , तो आप तुरंत रुक सकते हैं: आप सबसे छोटी सबसेट पा सकते हैं, जिसकी gcd से जुड़ी सबसेट को देखकर । तो, आप जैसे ही आप एक समूह तक पहुंच रोक सकता ऐसी है कि जो आप जल्दी बंद करने के लिए यदि आप एक छोटे सबसेट को खोजने के लिए अनुमति देता है,।S9=S1×S8k∈[1,2,4,8,9]1∈Skk1∈Sk11Sk1∈Sk
यह समय-कुशल और स्थान-कुशल होना चाहिए। स्थान बचाने के लिए, प्रत्येक तत्व , आपको पूरे सेट को संग्रहीत करने की आवश्यकता नहीं है: यह दो बैकपॉइंटर्स को स्टोर करने के लिए पर्याप्त है (इसलिए S_i के दो तत्व जिसे आपने पाने के लिए gcd लिया था ) वैकल्पिक रूप से संबंधित उपसमूह का आकार।एस मैं , एस जे एक्सx∈SkSi,Sjx
सिद्धांत रूप में, आप किसी अन्य जोड़ श्रृंखला द्वारा अनुक्रम को प्रतिस्थापित कर सकते हैं । मुझे नहीं पता कि कुछ अन्य जोड़ श्रृंखला कोई बेहतर होगी या नहीं। इष्टतम विकल्प सही उत्तरों के वितरण और सेट के अपेक्षित आकार पर निर्भर हो सकता है , जो मेरे लिए स्पष्ट नहीं है, लेकिन संभवतः अनुभव के माध्यम से अनुभवजन्य रूप से प्राप्त किया जा सकता है।एस के[1,2,4,8,9]Sk
क्रेडिट: के प्रत्येक तत्व के साथ संख्या के एक सबसेट के भंडारण के विचार के लिए KWillets मेरे धन्यवाद , जो जल्दी रोक की अनुमति देता है।Si