रेंज से खींचे गए वज़न के लिए डायजेक्स्ट्रा के एल्गोरिथ्म को संशोधित करना


10

मान लीजिए कि मेरे पास एक निर्देशित ग्राफ है जिसमें रेंज वेट जहां स्थिर है। अगर मैं दिज्क्स्ट्रा के एल्गोरिथ्म का उपयोग करते हुए सबसे छोटा रास्ता खोजने की कोशिश कर रहा हूं, तो मैं एल्गोरिथ्म / डेटा संरचना को कैसे संशोधित कर सकता हूं और की समय जटिलता में सुधार कर सकता हूं ।[1,,K]KO(|V|+|E|)


आपको अधिक विशिष्ट होना चाहिए, आपकी डेटा संरचना क्या है? और आपको कम नहीं मिल सकता है । व्याख्यान की समीक्षा करें। O(V+E)
जोनाप्रेटो

सिर्फ इसलिए कि अलग-अलग एज वेट की संभावनाएं छोटी हैं, इसका मतलब यह नहीं है कि दूरी की संख्या कम है।
जो

3
नीले रंग के साथ अपने ग्राफ के पहले रंग कोने, तो आकार में से प्रत्येक के किनारे पर उप-विभाजन में (जोड़कर किनारों uncolored कोने), तो इस नए ग्राफ पर BFS चलाने के लिए, नीले नोड्स शुरू नोड से कम से कम पथ को खोजने के लिए, यह यदि आपके पास निरंतर । t t - 1 O ( | V | + | | E | ) kttt1O(|V|+|E|)k

@SaeedAmiri इसे उत्तर के रूप में क्यों नहीं लिखते?
जो

@ जो क्योंकि यह दिक्स्ट्रा को संशोधित नहीं कर रहा है (कम से कम सीधे दिक्स्ट्रा से संबंधित नहीं है)।

जवाबों:


16

बढ़त वजन में पूर्णांक हैं, तो , आप लागू कर सकते हैं डिज्कस्ट्रा के दशक में चलाने के लिए हे ( कश्मीर | वी | + || ) समय है, तो निम्न @ rrenaud के सुझाव। यहाँ एक अधिक स्पष्ट व्याख्या है।{0,1,,K}O(K|V|+|E|)

किसी भी समय, प्राथमिकता कतार में (परिमित) कुंजियाँ कुछ रेंज , जहाँ D प्राथमिकता कुंजी से हटाए गए अंतिम कुंजी का मान होता है। (हर कुंजी कम से कम डी है , क्योंकि दिज्कस्ट्रा के एल्गोरिदम द्वारा हटाए गए कुंजी का क्रम गैर-घट रहा है, और प्रत्येक कुंजी अधिकांश डी + के पर है , क्योंकि हर कुंजी का मूल्य d [ u ] + w t ( u , w ) है कुछ बढ़त ( यू ,{D,D+1,,D+K}DDD+Kd[u]+wt(u,w) जहां[ यू ] कुछ शीर्ष के स्त्रोत से दूरी ही है यू कि पहले से ही हटा दिया गया है, इसलिए[ यू ] डी ।)(u,w)d[u]ud[u]D

इस वजह से, आप प्राथमिकता पंक्ति को एक गोलाकार सरणी आकार K + 1 के साथ लागू कर सकते हैं , जिसमें प्रत्येक कक्ष एक बाल्टी होता है। कुंजी के साथ एक शिखर स्टोर कश्मीर सेल में बाल्टी में एक [ ( कश्मीर ) ] जहां ( कश्मीर ) = कश्मीर आधुनिक ( कश्मीर + 1 )डी का ध्यान रखें । संचालन निम्नानुसार करें:A[0..K]K+1kA[h(k)]h(k)=kmod(K+1)D

  • हटाना मिनट : एक ओर जहां खाली है, वेतन वृद्धि डी । तब हटाएं और A [ h ( D ) ] से एक शीर्ष को लौटाएं ।A[h(D)]DA[h(D)]

  • कुंजी साथ डालें : A [ h ( k ) ] की बाल्टी में शीर्ष जोड़ें ।kA[h(k)]

  • कमी-कुंजी को कश्मीर ' : से शिखर पर ले जाएँ एक [ ( कश्मीर ) ] के लिए एक [ ( कश्मीर ' ) ]kkA[h(k)]A[h(k)]

सम्मिलित करें और कमी-कुंजी, निरंतर समय संचालन कर रहे हैं तो कुल समय उन कार्यों में खर्च किया जाएगा । डिलीट-मिन में बिताया गया कुल समय O ( | V | ) प्लस D का अंतिम मान होगा । D का अंतिम मूल्य स्रोत से किसी भी शीर्ष पर अधिकतम (परिमित) दूरी है (क्योंकि एक डिलीट-मिन जो मुझे पुनरावृत्तियों में लेता है वह D को i से बढ़ाता है )। अधिकतम दूरी K ( | V | - 1) पर हैO(|V|+|E|)O(|V|)DDiDi क्योंकि प्रत्येक पथ में सबसे अधिक है | वी | - 1 किनारे। इस प्रकार, एल्गोरिथम द्वारा बिताया गया कुल समय O ( K | V | + | E | ) हैK(|V|1)|V|1O(K|V|+|E|)


मुझे परिपत्र कतार पसंद है, यह मूल रूप से K * v आकार के सरणी के मेरे विचार से बेहतर है, जहां किसी भी समय केवल एवी आकार के स्लाइस का उपयोग किया जाता है।
रेनॉड न्यू

मैंने इसे एक डबल लिंक्ड सूची का उपयोग करके कार्यान्वित किया, क्या इसका मतलब यह है कि मिन कुंजी खोजने के लिए ओ (1) है?
user1675999

@ user1675999, मुझे यकीन नहीं है। यदि आपकी सूची कुंजी द्वारा क्रमबद्ध है, तो आप कुशलतापूर्वक प्रविष्टि और कमी-कुंजी कैसे करते हैं? यदि आपकी सूची कुंजी द्वारा क्रमबद्ध नहीं है, तो आप कुशलतापूर्वक डिलीट-मिन कैसे करते हैं?
नील यंग

5

मैं यहाँ मानता हूँ कि एक पूर्णांक है और किनारे का वज़न अभिन्न है। अन्यथा यह वास्तव में आपको कुछ भी नहीं खरीदता है, आप हमेशा वज़न कम कर सकते हैं ताकि मिन एज में लागत 1 हो और अधिकतम में K खर्च हो , इसलिए समस्या मानक छोटी पथ समस्या के समान है।K1K

एल्गोरिथ्म / प्रमाण स्केच: की एक सरणी के रूप में लागू पागल रास्ता इस तरह का में प्राथमिकता कतार लागत द्वारा सूचीबद्ध की गई सूचियाँ और अन्यथा मानक दिक्स्ट्रा के एल्गोरिथ्म का उपयोग करें। एक काउंटर रखें जो न्यूनतम आइटम की लागत को ढेर में ट्रैक करता है। रैखिक स्कैनिंग द्वारा आइटमों को हटाए जाने के बाद डीक्यू कॉल को हल करें । हां, इस तरह की आवाजें पागल लगती हैं, लेकिन निरंतर केK×|V|Kआइए आप रैखिक स्कैन के खिलाफ अपने एल्गोरिथ्म अंतर्ज्ञान को धोखा और मूर्ख बनाते हैं। आपको केवल अंतिम मिनट के मार्कर से स्कैन करने की आवश्यकता है क्योंकि डिस्क्स्ट्रा का एल्गोरिथ्म आपके कतार कार्यान्वयन के लिए अच्छा है। जब तक यह एक विकृति का अनुरोध करता है, तब तक कतार में डाली गई वस्तुएँ हमेशा पिछले न्यूनतम के बराबर या उससे अधिक होती हैं। संभव सबसे लंबा छोटा रास्ता , इसलिए आपकी परिशोधन स्कैनिंग लागत K × है | वी | = O ( | V | ) यदि K स्थिर है।K×|V|K×|V|=O(|V|)


-2

आप समाधान खोजने के लिए टोपोलॉजिकल सॉर्ट का उपयोग कर सकते हैं, स्रोत को डिग्री 0 होने दें, फिर स्रोत से प्रत्येक किनारे पर जाएँ, यदि किसी अन्य शीर्ष पर 0 डिग्री है तो उसे कतार में रखें और ऐसा करते रहें। इस मामले में (ग्राफ के अंदर चक्र के बिना) यह वी + ई को प्राप्त कर सकता है क्योंकि यह प्रत्येक शीर्ष और किनारों के माध्यम से एक बार और केवल एक बार जाएगा।


प्रश्न से असंबंधित लगता है? सवाल यह नहीं मानता है कि ग्राफ एसाइक्लिक है, और आपका समाधान इस तथ्य का उपयोग नहीं करता है कि वजन एक निरंतर सीमा से खींचा जाता है।
xskxzr
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.