यह गतिशील प्रोग्रामिंग के लिए एक समस्या प्रतीत होता है। जब आप अपनी सरणी बनाते हैं, तो आप प्रत्येक विशेष अनुक्रमणिका में संचयी योग युक्त एक और सरणी बनाते हैं। इसलिए उस सरणी में प्रत्येक i
में 1..i
से रकम है।
अब यह देखने के लिए कि सूचकांक p..q
के लिए मानों का योग SUM(q) - SUM(p-1)
है (विशेष मामला है कि SUM(0)
0
है) के साथ आसान है। जाहिर है, मैं यहां 1-आधारित इंडेक्स का उपयोग कर रहा हूं ... यह ऑपरेशन ओ (1) है, इसलिए अब आपको सबसे अच्छा खोजने के लिए ओ (एन) एल्गोरिदम की आवश्यकता है।
एक आसान समाधान p
और q
का ट्रैक रखना और सरणी के माध्यम से इन्हें चलाना है। शुरू करने के लिए आप q
के साथ विस्तार करें। फिर आप p
अनुबंध करते हैं और बार-बार q
का विस्तार करते हैं, जैसे आपके सरणी के माध्यम से एक कैटरपिलर क्रॉलिंग।
q
का विस्तार करने के लिए:
p <- 1
q <- 1
while SUM(q) - SUM(p-1) < K
q <- q + 1
end while
अब q
स्थान है जहाँ subarray राशि सिर्फ पार कर गया है पर है (या के बराबर है) K
। उपराय की लंबाई q - p + 1
है।
q
लूप के बाद आप जांच करते हैं कि उपर्युक्त लंबाई आपके वर्तमान सर्वोत्तम से कम है या नहीं। फिर आप p
को एक चरण से आगे बढ़ाते हैं (ताकि आप गलती से इष्टतम समाधान पर न छोड़ें) और फिर जाएं।
आपको वास्तव में SUM
सरणी बनाने की ज़रूरत नहीं है ... आप केवल उपरोक्त राशि बना सकते हैं जैसे आप जाते हैं ... आपको पहले 'वास्तविक' p
का उपयोग करने के लिए वापस जाना होगा ।
subsum <- VAL(1)
p <- 1
q <- 1
while q <= N
-- Expand
while q < N and subsum < K
q <- q + 1
subsum <- subsum + VAL(q)
end while
-- Check the length against our current best
len <- q - p + 1
if len < bestlen
...
end if
-- Contract
subsum <- subsum - VAL(p)
p <- p + 1
end while
नोट्स:
j_random_hacker ने कहा: यह समझाने के लिए मदद मिलेगी सभी हे के बजाय वास्तव में क्यों यह सिर्फ हे (एन) की जांच अलग subarrays कि इस एल्गोरिथ्म की जांच करता है को स्वीकार्य है (एन^2) संभव अलग subarrays
गतिशील प्रोग्रामिंग दर्शन है:
- समाधान पथ का पालन न करें जो एक गैर-इष्टतम परिणाम का कारण बनेंगे; और
- नए समाधान की गणना करने के लिए पिछले समाधानों के ज्ञान का उपयोग करें।
इस मामले में एकमात्र समाधान उम्मीदवार (कुछ (p,q)
ऐसे p <= q
कि) तत्वों का संक्षेप द्वारा गणना की जाती है। चूंकि वे तत्व सकारात्मक पूर्णांक हैं, हम जानते हैं कि किसी भी समाधान उम्मीदवार (p,q)
के लिए, समाधान उम्मीदवार (p,q+1)
बड़ा होगा।
और इसलिए हम जानते हैं कि (p,q)
एक न्यूनतम समाधान है तो (p,q+1)
नहीं है। जैसे ही हमारे पास उम्मीदवार होता है, हम अपनी खोज समाप्त करते हैं, और परीक्षण करते हैं कि क्या उम्मीदवार अब तक किसी भी व्यक्ति से बेहतर है या नहीं। इसका मतलब है प्रत्येक p
के लिए, हमें केवल एक उम्मीदवार का परीक्षण करने की आवश्यकता है। इससे p
और q
दोनों ही बढ़ रहे हैं, और इस प्रकार खोज रैखिक है।
इसका दूसरा भाग (पिछले समाधानों का उपयोग करके) sum(p,q+1) = sum(p,q) + X(q+1)
और इसी प्रकार sum(p+1,q) = sum(p,q) - X(p)
को पहचानने से आता है। इसलिए, हमें प्रत्येक चरण में p
और q
के बीच सभी तत्वों को योग करने की आवश्यकता नहीं है। जब भी हम खोज बिंदुओं में से किसी एक को अग्रिम करते हैं तो हमें केवल एक मूल्य जोड़ना या घटाना होगा।
आशा है कि मदद करता है।
तत्वों के क्रम को गड़बड़ नहीं करना होगा? Subarray द्वारा आपका क्या मतलब है? सरणी में तत्वों का एक संगत अनुक्रम, या सरणी में तत्वों का सबसेट? – nhahtdh
इस मामले में छंटनी लागू नहीं की जा सकती क्योंकि यह आइटम के क्रम को बदल देगा। – Thinhbk
मुझे लगता है कि आदेश महत्वपूर्ण नहीं है। यानी {1,2,3} और {2,1,3} समान उप सरणी के रूप में माना जाता है। Subrarray तत्वों के एक उप-समूह में referes और जरूरी नहीं कि इस संदर्भ में एक संगत अनुक्रम। –