दिए गए एक के बिना घटते क्रम को खोजने के लिए एक लालची एल्गोरिथ्म का उपयोग कैसे करें?


20

आपको n पूर्णांकों सभी को और बीच में दिया गया है । प्रत्येक पूर्णांक अंतर्गत आपको एक पूर्णांक को और बीच में इस आवश्यकता के साथ लिखना चाहिए कि का गैर-घटता क्रम हो। इस तरह के अनुक्रम के विचलन को परिभाषित करें । एक एल्गोरिथ्म डिज़ाइन करें जो रनटाइम O (n \ sqrt [4] {l}) में न्यूनतम विचलन के साथ b_i का पाता है ।a1,,an0laibi0lbimax(|a1b1|,,|anbn|) हे ( एन 4 biO(nl4)

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

जवाबों:


9

चलो निम्नलिखित अवलोकन के साथ शुरू करते हैं:

चलो max निरूपित अनुक्रम की अधिकतम a1,...,an , और min निरूपित अपने न्यूनतम। यदि a1=max , तो b1=b2=...=bn=(max+min)/2 इष्टतम है।

यह एक केस क्यों है? ठीक है, चूंकि अनुक्रम अधिकतम से शुरू होता है, या तो हम b1 बड़ा चुनते हैं , और अनुक्रम के न्यूनतम से एक बड़ा विचलन पीड़ित करते हैं (चूंकि किसी भी बाद bi को b_1 से अधिक या उसके बराबर होना चाहिए b1), या हम b1 छोटे का चयन करते हैं और पीड़ित होते हैं अधिकतम करने के लिए विचलन max। औसत अधिकतम विचलन को कम करता है।

अब हम सामान्य अवलोकन a_1, ..., a_n पर उपयोग करने के लिए इस अवलोकन को सामान्य बनाने का प्रयास कर सकते हैं a1,...,an। उदाहरण के लिए, हम किसी भी क्रम को बाद में विभाजित कर सकते हैं, जैसे कि प्रत्येक संबंधित परिणाम की अधिकतम के साथ शुरू होता है।

उदाहरण: का विभाजन , , और ।( 2 ) ( 6 , 4 , 1 , 5 , 2 ) ( 8 , 7 , 5 , 1 )(2,6,4,1,5,2,8,7,5,1)(2)(6,4,1,5,2)(8,7,5,1)

इस विभाजन को देखते हुए, हम अब इन प्रत्येक बाद को अलग-अलग हल कर सकते हैं, और का असाइनमेंट प्राप्त कर सकते हैं , जो हालांकि गैर-घटती स्थिति का उल्लंघन कर सकता है। यह इष्टतमता खोए बिना तय किया जा सकता है।bi

निरीक्षण करें कि अंतिम अनुक्रम में हमेशा पूरे अनुक्रम का अधिकतम होता है (अन्यथा, इसके बाद एक और बाद में होगा)। बता दें कि वे मूल्य हैं जो हमने परवर्ती को दिए हैं। अब, में गैर-कमी को प्राप्त करने के लिए , हम पर पीछे से शुरू करते हैं और सामने की ओर अपना काम करते हैं। यदि से बड़ा है , तो हम बस । यदि यह छोटा है, तो हम इसे रखते हैं। फिर, हम की तुलना के साथ आगे बढ़ना के साथ और इतने पर। ध्यान दें कि किसी भी को के मान से कम करनाडब्ल्यू 1 , डब्ल्यू 2 , , डब्ल्यू कश्मीर कश्मीर डब्ल्यू 1maxw1,w2,...,wkkडब्ल्यू कश्मीर डब्ल्यू कश्मीर - 1 डब्ल्यू कश्मीर डब्ल्यू कश्मीर - 1 : = w कश्मीर डब्ल्यू कश्मीर - 2 डब्ल्यू कश्मीर - 1 डब्ल्यू मैं डब्ल्यू मैं + 1 डब्ल्यू मैं डब्ल्यू मैं + 1w1,...,wkwkwk1wkwk1:=wkwk2wk1wiwi+1कभी भी विचलन नहीं बढ़ता है, क्योंकि साथ नियत की गई में मान हमेशा साथ नियत की गई अधिकतम सीमा से कम होता है ।wiwi+1

यह एल्गोरिथम सही होना चाहिए, मुझे लगता है। चल रहे समय के बारे में, महत्वपूर्ण कदम बाद के लिए बढ़ती मैक्सिमा की गणना कर रहा है, जो में संभव है ? निश्चित नहीं है कि कहां योगदान देता है।एलO(n)l


2

मैं यहां जोर से सोचने जा रहा हूं कि आपके द्वारा दिए गए संकेतों के माध्यम से काम कर रहा है। आइए यह कहने के मूल संकेत पर जाएं कि वह है जिसे आपको पहले प्रयास करना चाहिए। मैं उस समय के लालची एल्गोरिथ्म के बारे में सोच सकता हूं।O(nl)

समय जटिलता का हिस्सा आप प्रत्येक मूल्य की प्रत्येक क्रिया की गिनती की एक सूची रख सकते हैं इसका मतलब है । वह बस एक सेट जो सेट में प्रत्येक की गिनती को ट्रैक करता है । आप एक बार इनपुट अनुक्रम को स्कैन करके जन्मजात सूची बना सकते हैं।0 .. l काउंट = C 0 , , C l ll0..lCount=C0,,Cll

अधिकतम और न्यूनतम मूल्य प्राप्त करने के लिए आप इस सूची को में स्कैन कर सकते हैं । यदि आप इस मध्य बिंदु के साथ की पूरी सूची को भरना चाहते हैं तो आपके विचरण में इस मान और अधिकतम / मिनट का अंतर होगा। यह मूल रूप से आपकी सबसे खराब स्थिति है, चलो इसे कहते हैं ।b b wO(l)bbw

तो बाईं ओर से लिए अपने तरीके से काम करें । आप दोनों से इस elemeent ड्रॉप कर सकते हैं और मिनट / की अधिकतम प्राप्त में । अब हम लालची हो सकते हैं। हम चयन नहीं करते हैं क्योंकि यह शेष पूरी सूची को (गैर-घटती आवश्यकता को पूरा करने के लिए) मजबूर करता है और इस प्रकार विचरण को बढ़ाता है। न्यूनतम मूल्य जिसे हम चुन सकते हैं वह है । यदि स्वीकार्य सीमा में है, तो हम इसका चयन करते हैं, यदि न्यूनतम से कम का उपयोग करें। यह ज्ञात बाधाओं को पर विचरण को कम करता है । गणना [ मैं + 1 ] ... [ एन ] हे ( एल ) मैं > w[ मैं - 1 ] एक मैं मैंbiCountb[i+1]b[n]O(l)bi>bwb[i1]aibi

यह सिर्फ एक विचार है, शायद मैं भाग्यशाली हूं और यह आपको सही दिशा में इंगित करता है। यह एल्गोरिथ्म काम नहीं कर सकता है (यह मेरे कुछ सरल परीक्षणों के लिए करता है), लेकिन यह दिए गए संकेतों से मेल खाता है, इसलिए शायद यह मददगार है। यदि सही है तो यह देखना आसान है कि भाग सुनिश्चित करने के लिए गिराया जा सकता है , आगे भी, मुझे यकीन नहीं है।O ( लॉग l )O(l)O(logl)


2

यहां प्रोफेसर का समाधान है, जिसे वह "कमी" कहते हैं: प्रत्येक से से , एक समाधान का निर्माण करने का प्रयास करें यदि हम जानते हैं कि विचलन से कम या बराबर है । पहला जिसके लिए एक समाधान पाया जा सकता है वह है न्यूनतम विचलन। हम समय में विचलन को देखते हुए एक समाधान पा सकते हैं । तो चल रहा समय । फिर, रैखिक खोज का उपयोग करने के बजाय, हम सबसे छोटी विचलन का निर्धारण करने के लिए द्विआधारी खोज का उपयोग कर सकते हैं जिसके लिए एक समाधान संभव है। यह लिए चल रहे समय को कम करता है , जो की आवश्यकता को पूरा करता है ।0 एल मैं मैं हे ( एन ) हे ( एन एल ) हे ( एन लॉग एल ) हे ( एन 4 i0liiO(n)O(nl)O(nlogl)O(nl4)


4
तो एक चाल थी ... लेकिन मैं "O (n) समय में विचलन को देखते हुए एक समाधान पा सकता हूँ" .. यह कैसे नहीं है दिलचस्प हिस्सा? O(nl4)
जुम्मे

@jmad को देखते हुए , प्रत्येक के लिए ले न्यूनतम मूल्य है जो कम से कम है पिछले सभी के रूप में बड़ी के रूप में के रूप में , और जो अधिक नहीं है से दूर । अगर हमें ऐसा कोई मूल्य नहीं मिल रहा है, तो इसका क्या मतलब है? इसका मतलब है कि पिछले एक से अधिक है से भी बड़ा । तो पिछले एक तुलना में अधिक है से भी बड़ा । तो की है कि मूल्य संभव नहीं था। यदि आप इस तरह से अटक गए बिना मानों के माध्यम से प्राप्त करते हैं, तो आपको समाधान मिल गया हैजे बी जे बी कश्मीर मैं एक जे बी टी मैं एक जे एक टी 2 मैं एक जे मैं n मैं हे ( एन )ijbjbkiajbtiajat2iajiniबिना पीछे के, समय में । O(n)
jwg

O (n log l) एक मजबूत संकेत होता जो आपको 0 से l तक की सीमा पर कुछ द्विआधारी खोज करने की आवश्यकता होती है।
gnasher729

0

मुझे लगता है कि यह ओ (एन) में उल्लेखनीय होना चाहिए।

समान समस्या को लें: , 1 ≤ i ≤ n, और d problem 0 को देखते हुए , को गैर-अवरोही क्रम में खोजें जैसे किसभी i के लिए , या यह दिखाएं कि यह संभव नहीं है। यह O (n) में किया जा सकता है, और द्विआधारी खोज का उपयोग करके मूल समस्या O (n log l) में हल की जाती है।b i | एक मैं - मैं | daibi|aibi|d

अब अगर मैं ≤ j ऐसा है कि a_i - a_j> 2d है, तो कोई समाधान नहीं है (क्योंकि )।biaid,bjaj+d<ai2d+d=aidbi

लेकिन अगर a_i - a_j ≤ 2d सभी i I j के लिए है तो मुझे लगता है कि एक समाधान हमेशा मिलेगा। इसलिए हम सभी को मी (जे के लिए m = max (a_i - a_j) ढूंढना है, और d = फ्लोर ((m + 1) / 2) का चयन करना है। वह अधिकतम O (n) में पाया जा सकता है।


गहन विचार! मैं विश्वास कर सकता हूं कि यह कुछ काम कर सकता है, लेकिन ऐसा लगता है कि आपके उत्तर के अंत में एक बड़ा अंतर है और मैं विवरणों को भरने में कठिन समय लगा रहा हूं। क्या आपके पास एक सबूत है कि अगर सभी तो एक समाधान हमेशा मौजूद रहता है? इससे भी महत्वपूर्ण बात यह है कि हम इसे कैसे खोजते हैं? मूल प्रश्न कहता है कि हमें की खोज करनी चाहिए । यहां तक ​​कि अगर हम मानते हैं कि एक समाधान मौजूद है, तो मुझे यह देखने में कठिनाई हो रही है कि संबंधित को कैसे खोजना है । क्या आप इसे विस्तार में बताने में सक्षम हैं? मैं जे बी मैं मैंaiaj2dijbibi
डीडब्ल्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.