मुझे विश्वास है कि मैं यह कर सकता हूं ओ (एन लॉग एन) है।
सबसे पहले, B
सरणी को सॉर्ट करें, A
सरणी (और क्रमपरिवर्तन को याद रखना) पर समान क्रमपरिवर्तन लागू करें। यह ओ (एन लॉग एन) भाग है। चूंकि हम सभी के बराबर हैं, इसलिए ए और बी सरणी में समान क्रमपरिवर्तन लागू करना न्यूनतम नहीं बदलता है।
एक क्रमबद्ध B
सरणी के साथ, बाकी एल्गोरिदम वास्तव में ओ (एन) है।
प्रत्येक के लिए, एक सरणी सी के [i] = | बी [i] - बी [के] |
(नोट:। हम वास्तव में सी कश्मीर का निर्माण नहीं होगा ... हम सिर्फ आसान तर्क के लिए एक अवधारणा के रूप में उपयोग करेंगे)
गौर करें कि मात्रा हम (के अधिक) कम करने के लिए कोशिश कर रहे हैं ए [i] * सी के [i] की राशि। के आगे जाना है और कि एक नाम दे दो:
परिभाषित करें: एस कश्मीर = Σ एक [i] * सी कश्मीर [i]
अब, किसी विशेष कश्मीर के लिए, क्या सी करता कश्मीर हमशक्ल?
ठीक है, सी के [के] = 0, जाहिर है।
ज्यादा दिलचस्प है, क्योंकि बी सरणी सॉर्ट हो जाता है, हम निरपेक्ष मूल्य के संकेत से छुटकारा पाने के कर सकते हैं:
- सी कश्मीर [i] = बी [k] - बी [i], 0 के लिए < = मैं < कश्मीर
- सी कश्मीर [i] = 0, के लिए मैं = k
- सी कश्मीर [i] = बी [i] - बी [k], कश्मीर < के लिए मैं < n
चलिए दो और चीजों को परिभाषित करते हैं।
परिभाषा: टी कश्मीर = Σ एक [i] के लिए 0 < = मैं < कश्मीर
परिभाषा: यू कश्मीर = Σ एक [i] कश्मीर < के लिए मैं < n
(यही है, टी के ए यू के के पहले के -1 तत्वों का योग है ए के पहले के तत्वों के अलावा सभी का योग है।
कुंजी अवलोकन: एस कश्मीर को देखते हुए, टी कश्मीर, और यू कश्मीर, हम एस निरंतर में k + 1, टी k + 1, और यू k + 1 गणना कर सकता है पहर। कैसे?
टी और यू आसान हैं।
सवाल है, हम कैसे एस k + 1 को एस कश्मीर से मिलता है?
पर विचार करें क्या सी कश्मीर को होता है जब हम सी k + 1 में जाते हैं। हम बस बी से [के + 1] -बी [के] को 0 से के के प्रत्येक तत्व में जोड़ते हैं, और हम सी के 1 से एन तक (सी साबित) से प्रत्येक तत्व से उसी राशि को घटाते हैं। इसका मतलब है कि हमें टी के * (बी [के + 1] - बी [के]) जोड़ने और यू के * (बी [के + 1] - बी [के]) को एस से प्राप्त करने की आवश्यकता है के एस के + 1 पर।
बीजगणितीय ... एस के पहले के नियम ए [i] * (बी [के] - बी [i]) के 0 से के -1 के योग के बराबर हैं। (- बी [i] बी [k + 1])
के बीच का अंतर
एस कश्मीर के पहले कश्मीर मामले + 1 0 से योग K-1 का एक [i] * करने के लिए कर रहे हैं ये योग है, 0 से के -1 तक, (ए [i] * (बी [के + 1] - बी [i]) - (ए [i] * (बी [के] - बी [i]))। ए [i] शब्दों को फैक्टर करें और बी [i] शर्तों को 0 [के] 1 से प्राप्त करने के लिए शर्तों को रद्द करें [i] * (बी [के + 1] - बी [के]), जो कि है बस टी के * (बी [के + 1] - बी [के])।
इसी प्रकार एस के के अंतिम एन-के -1 शर्तों के लिए।
जब से हम एस , टी , और यू गणना कर सकता है रैखिक समय में, और हम लगातार समय में k + 1 एस के एस कश्मीर से जा सकते हैं, हम गणना कर सकते हैं रैखिक समय में सभी एस के। तो ऐसा करें, सबसे छोटा याद रखें, और आप कर चुके हैं।
मूल सरणी के लिए k
प्राप्त करने के लिए क्रम क्रमपरिवर्तन के विपरीत का उपयोग करें।
@Dukeline: मुझे लगता है कि वह सिर्फ पूर्ण मूल्य का मतलब है। – Nemo