सबसे बड़ा योग विभाज्य n द्वारा


16

मैंने स्टैकऑवरफ्लो पर यह सवाल पूछा , लेकिन मुझे लगता है कि यहां एक अधिक उपयुक्त स्थान है।

यह परिचय से एल्गोरिदम पाठ्यक्रम की एक समस्या है :

आपके पास पॉजिटिव पूर्णांकों के साथ एक सरणी (सरणी को सॉर्ट करने की आवश्यकता नहीं है या तत्वों को अद्वितीय)। एक सुझाव एल्गोरिथ्म तत्वों की सबसे बड़ी राशि है कि से विभाज्य है खोजने के लिए ।n O ( n ) एनanO(n)n

उदाहरण: । इसका उत्तर (तत्व )56 6 , 13 , 4 , 8 , 25a=[6,1,13,4,9,8,25],n=7566,13,4,8,25

यह गतिशील प्रोग्रामिंग का उपयोग करना और शेष साथ सबसे बड़ी राशि जमा करना अपेक्षाकृत आसान है ।0 , 1 , 2 , , एन - 1O(n2)0,1,2,...,n1

इसके अलावा, अगर हम तत्वों के एक सन्निहित अनुक्रम पर ध्यान देते हैं, तो समय में इष्टतम ऐसे अनुक्रम को खोजना आसान है , आंशिक रकम मोडुलो को संग्रहीत करके : S [i] = a [0] + [१] + \ डॉट्स एक [मैं] , प्रत्येक शेष के लिए आर सबसे बड़ा सूचकांक याद जे ऐसी है कि एस [जे] \ समतुल्य r \ pmod {n} , और फिर प्रत्येक के लिए मैं आप समझते हैं एस [जे] एस [i] जहां j , r = S [i] \ bmod n के अनुरूप सूचकांक है ।एन एस [ मैं ] = एक [ 0 ] + एक [ 1 ] + + एक [O(n)nS[i]=a[0]+a[1]++a[i]rjमैं एस [ जे ] - एस [ मैं ]S[j]r(modn)iS[j]S[i]jr=S[i]modn

लेकिन क्या सामान्य मामले के लिए O(n) समय समाधान है? कोई भी सुझाव प्रशंसनीय होगा! मुझे लगता है कि यह रैखिक बीजगणित से निपटने के लिए कुछ है, लेकिन मुझे यकीन नहीं है कि वास्तव में क्या है।

वैकल्पिक रूप से, यह O(nlogn) समय में किया जा सकता है ?


2
1. आपने स्टैक ओवरफ्लो पर एक ही प्रश्न पोस्ट किया है। कृपया एकाधिक साइटों पर एक ही प्रश्न पोस्ट न करें । हम एकाधिक SE साइटों पर कई प्रतियाँ नहीं चाहते हैं। यदि आपको कोई स्वीकार्य उत्तर नहीं मिला है, तो किसी अन्य साइट पर माइग्रेशन के लिए अपने प्रश्न को फ़्लैग करना ठीक है, लेकिन कृपया उसी चीज़ को कहीं और न रखें। 2. क्या आप पाठ्यपुस्तक या पाठ्यक्रम में एक संदर्भ / प्रशस्ति पत्र / लिंक दे सकते हैं जहां यह दिखाई दिया? आप कैसे सुनिश्चित हैं कि वहाँ एक O(n) समय समाधान मौजूद है?
डीडब्ल्यू

5
क्या आपके विश्वविद्यालय पर चुनौती अभी भी खुली है? यह पाठ्यक्रम के लिए लिंक को देखने के लिए वास्तव में उपयोगी होगा, सटीक प्रश्न और अगर यह वास्तव में और इसे तैयार करने वाले लोग अपने उत्तर को स्पष्ट करेंगे / प्रकाशित करेंगे। O(n)
ईविल

ओ (एन 2) ओ (एन 2) को गतिशील प्रोग्रामिंग का उपयोग करके और शेष 0,1,2, ..., n, 10,1,2, ..., n। 1 के साथ इसे प्राप्त करना अपेक्षाकृत आसान है। क्या आप इसे थोड़ा विस्तृत कर सकते हैं? मैं समझ सकता हूँ कि यदि हम केवल सन्निहित तत्वों पर विचार करते हैं तो यह n-squared कैसे होगा, लेकिन गैर-सन्निहित तत्वों के साथ भी, क्या यह क्रम में घातीय नहीं होगा?
निथिश इनपरप्सी ऑफहापीस

जवाबों:


4

यहाँ कुछ यादृच्छिक विचार दिए गए हैं:

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

    लागत होगा अगर हम संसाधित कश्मीर तत्वों। है एक कम के लिए बाध्य Ω ( एन लॉग इन करें n ) , क्योंकि हम सभी तत्वों को सॉर्ट करने के लिए की जरूरत नहीं है इस एल्गोरिथ्म पर। यह केवल O ( n log k ) समय लेता है ताकि k सबसे छोटे तत्व प्राप्त कर सके ।O(nk)kΩ(nlogn)O(nlogk)k

  • अगर हम सेट के बारे में सबसे बड़े योग के साथ सेट करते हैं, तो हम सबसे बड़े योग के साथ सेट करते हैं, हम में समस्या को हल करने के लिए तेजी से फूरियर-ट्रांसफॉर्मेशन-आधारित बहुपद गुणन का उपयोग करने में सक्षम हो सकते हैं। लॉग एन ) ) समय। जब डोमेन सीमा सीमित हो, तो 3SUM में जो किया जाता है, उसके समान । (नोट: उपयोग एक द्विआधारी खोज करने के लिए बराबरी दोहराया है, और आप मिल जाएगा हे ( एन कश्मीर ( लॉग एन ) ( लॉग लॉग एन ) ) जहां कश्मीरO(n(logn)2(loglogn))O(nk(logn)(loglogn))k छोड़े गए तत्वों की संख्या है।)

  • जब समग्र है, और लगभग सभी शेष में से एक की एक बहु हैं n के कारकों, महत्वपूर्ण समय शेष है कि कारक की एक बहु नहीं हैं पर ध्यान केंद्रित करके बचाया जा सकता है।nn

  • जब एक शेष rबहुत आम है, या केवल कुछ अवशेष मौजूद हैं, तो 'अगला खुला स्लॉट का ट्रैक रखें यदि आप यहाँ से शुरू करते हैं और r' जानकारी द्वारा आगे बढ़ते रहते हैं तो बहुत सारे स्कैनिंग-फॉर-जम्प-इन-ओपन-स्पॉट बचा सकते हैं समय।

  • आप केवल रीचैबिलिटी को ट्रैक करके और बिट मास्क (फ़्लिप्ड डायनेमिक अल्गोरिथम) का उपयोग करके लॉग फ़ैक्टर को दाढ़ी कर सकते हैं , फिर एक बार टारगेट तक पहुँचने के बाद बैकट्रैकिंग करें।

  • समानांतर में चलाया जा रहा है गतिशील प्रोग्रामिंग एल्गोरिथ्म बहुत उत्तरदायी है। प्रत्येक बफर स्लॉट के लिए एक प्रोसेसर के साथ आप लिए नीचे उतर सकते हैं । वैकल्पिक रूप से, O ( n 2 ) चौड़ाई का उपयोग करके , और पुनरावृति एकत्रीकरण के बजाय एकत्रीकरण को जीतें, सर्किट की गहराई की लागत O ( लॉग 2 n ) तक सभी तरह से प्राप्त कर सकते हैं ।O(n)O(n2)O(log2n)

  • (मेटा) मुझे दृढ़ता से संदेह है कि आपको जो समस्या दी गई थी वह सन्निहित राशि के बारे में है । यदि आप वास्तविक समस्या से जुड़े हैं, तो यह सत्यापित करना आसान होगा। अन्यथा मैं इस बात से बहुत हैरान हूं कि यह समस्या कितनी कठिन है, यह देखते हुए कि इसे "इंट्रोडक्शन टू अल्गोरिथम" नामक एक कोर्स में सौंपा गया था। लेकिन हो सकता है कि आपने कक्षा में एक चाल को कवर किया हो जो इसे तुच्छ बनाता है।


बिंदु एक के लिए। यह समस्या के विनिर्देशों में नहीं लिखा है, इसलिए आप ऐसा नहीं मान सकते। इसके अलावा, समस्या यह नहीं कह रही है कि आप सरणी को संशोधित नहीं कर सकते हैं या नए बना सकते हैं, आप वास्तव में कर सकते हैं। केवल एक चीज आपको बस इतना करना है कि संख्या अभिव्यक्त किया एक साथ आप सबसे बड़ा योग है कि से विभाज्य है देने लगता है में हे ( एन ) समय जटिलता (आमतौर पर यह सिर्फ समय जटिलता मान लिया है)। nO(n)
नबर

2
@ ईवीएलजेएस 0 के साथ सबसे बड़ी राशि वाला उपसमूह पूर्ण सेट के योग के साथ शेष बधाई के साथ सबसे छोटी राशि के साथ सबसेट निकालने के बाद पूर्ण सेट के बराबर है। से सबसे छोटी सम्‍मिलित राशि की तलाश r 2 के लिए सबसे बड़ी सम्‍मिलित राशि की तलाश करने से अधिक सुविधाजनक है क्‍योंकि यह आपको जारी रखने के बजाय एक समाधान (जब बढ़ते क्रम में प्रसंस्करण तत्व) मिलते हैं, तो आप इसे समाप्त कर सकते हैं। r1r2
क्रेग गिदनी

-1

मेरा प्रस्तावित एल्गोरिथ्म इस प्रकार है:

एक योग n से विभाज्य है यदि आप केवल सारांश जोड़ते हैं जो n के गुणक हैं।

शुरू करने से पहले आप एक हैशम को कुंजी के रूप में एक इंट और मूल्य के रूप में सूचकांक की एक सूची के साथ बनाते हैं। आप एक परिणाम सूची भी बनाते हैं जिसमें सूचकांकों होते हैं।

फिर आप सरणी पर लूप करते हैं और प्रत्येक इंडेक्स जोड़ते हैं जो आपके परिणाम सूची में शून्य है। हर दूसरे इंडेक्स के लिए आप निम्न कार्य करते हैं:

आप इस इंडेक्स के मान mod n को n से घटाते हैं। यह परिणाम आपके हैशमैप की कुंजी है जो आवश्यक मूल्य वाले तत्वों के लिए सूचकांकों को संग्रहीत करता है। अब, आप इस सूची को हैशमैप में सूची में जोड़ते हैं और आगे बढ़ते हैं।

आपके द्वारा आउटपुट पर गणना की गई सरणी पर लूपिंग समाप्त करने के बाद। आप ऐसा करते हैं कि सूचकांक के मूल्य के अनुसार हैशमैप में प्रत्येक सूची को क्रमबद्ध करके। अब आप हैशमैप में प्रत्येक जोड़े को n तक जोड़ते हैं। इसलिए यदि n = 7 आप 3 और 4 के लिए हैशमैप खोजते हैं और यदि आपको दोनों में प्रविष्टि मिली है, तो आप दो सबसे बड़े मान लेते हैं, उन्हें उनकी सूचियों से हटाते हैं और उन्हें अपने परिणाम सूची में जोड़ते हैं।

अंतिम सिफारिश: अभी भी एल्गोरिथ्म का परीक्षण नहीं किया था, एक क्रूर बल एल्गोरिथ्म का उपयोग करके इसके खिलाफ एक टेस्टकेस लिखें।


2
लालची, रैखिक, काम नहीं कर रहा। आप केवल उन तत्वों पर विचार करते हैं जो n द्वारा विभाज्य हैं और n द्वारा युग्मित युग्म हैं, त्रिगुणों के बारे में और क्या? यह तुच्छ मामले पर अधिकतम उप-योग की गारंटी नहीं देता है। [2, 1, 8] -> अधिक से अधिक योग 9, लेकिन अपने एल्गोरिथ्म रिटर्न 3.
बुराई

@EvilJS क्या आपके उप एल्गोरिथ्म के साथ हुआ ? n2
डेल्टा-टर्मिनेटर

मेरी इस गलती को इंगित करने के लिए धन्यवाद। सुधार पर मेरा विचार उन सूचियों के ढेर का हैशम बनाना होगा जो मूल्य में वृद्धि के द्वारा आदेशित हैं और सरणी के माध्यम से एक पास पूरा करने के बाद ही जमा करना शुरू करते हैं।
टोबियास वुल्फ

आपके पास सरणी का सरणी है, जिसे क्रमबद्ध किया जाएगा, और "हैशमैप"% n है? आपको अभी भी उन्हें क्रमबद्ध करने की आवश्यकता है, और यदि आपने उन्हें छांटा है, तो न्यूनतम / अधिकतम मान लेना ठीक है, लेकिन फिर भी वास्तव में सबसेट का चयन करने का अपरिहार्य हिस्सा है, जो सबसे खराब स्थिति में लाभ नहीं देता है। वैसे भी अगर आपके पास कुछ सुधार हैं, तो शायद आप पोस्ट को संपादित कर सकते हैं?
ईविल

हां ढेर के साथ एक त्वरित विचार था। वास्तव में आपको केवल उस हैशमैप में सूचियों की आवश्यकता होती है जिसे आप क्रमबद्ध करते हैं। मुझे यकीन नहीं था कि यह मेरा पहला जवाब संपादित करने के लिए विनम्र है। आखिरकार मैंने अपने पहले प्रयास में गलती की।
टोबियास वुरफ्ल

-2

( /programming/4487438/maximum-sum-of-non-consistent-elements?rq=1 ) से इस डीपी विधि का उपयोग करें :

एक सरणी A [0..n] को देखते हुए, M (i) सूचकांकों वाले तत्वों का उपयोग कर इष्टतम समाधान दें। 0. i फिर M (-1) = 0 (पुनरावृत्ति में प्रयुक्त), M (0) = A [0], और M (i) = अधिकतम (M - (i - 1), M (i - 2) + A [i ]) के लिए मैं = 1, ..., एन। M (n) वह समाधान है जो हम चाहते हैं। यह O (n) है । आप स्टोर करने के लिए एक और ऐरे का उपयोग कर सकते हैं जो प्रत्येक सबप्रॉब्लम के लिए पसंद किया जाता है, और इसलिए चुने गए वास्तविक तत्वों को पुनर्प्राप्त करें।

M (i) = अधिकतम (M (i - 1), M (i - 2) + A [i]) के लिए पुनरावर्तन को ऐसे बदलें जो केवल N द्वारा विभाज्य होने पर संग्रहीत किया जाता है


2
यह काम नहीं करता है - मैं आपको इसकी वजह बताऊंगा। (संकेत: इसे निरंतर 1 सरणी पर चलाने का प्रयास करें।) इसके अलावा, इस समस्या में हम निरंतर तत्वों की अनुमति देते हैं।
युवल फिल्मस

1
यह बहुत अच्छा समाधान है, बस पूरी तरह से अलग (और बहुत आसान) समस्या के लिए।
ईविल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.