2013-02-19 28 views
5

डिजस्ट्रा के एल्गोरिदम के कार्यान्वयन में मेरे पास सभी नोड्स और 1 प्राथमिकता कतार सभी नोड्स के साथ 1 सरणी है। जब भी कोई नोड निकलता है तो मैं नई दूरी के साथ सभी आसन्न नोड्स को अपडेट करता हूं और यह कहां से आया, इसलिए मैं पथ को पीछे हट सकता हूं।प्राथमिकता कतार

प्राथमिकता कतार में नोड नई दूरी के साथ अद्यतन किया गया है और सरणी में नोड अद्यतन किया गया है जहां से यह नई दूरी से आया था। जब एक नोड dequeued है सरणी में अंतिम दूरी अद्यतन किया जाता है:

PathInfo current = pq.remove(); 
    path[current.pos].distance = current.distance; 

यह दोनों पिछले नोड और दूरी के साथ प्राथमिकता कतार के बारे में जानकारी के साथ सरणी अद्यतन करने के लिए स्वीकार्य है?

यह तब होता है जब भी एक बेहतर दूरी पाया जाता है:

 PathInfo key(i, newDistance); 
     path[i].distance = newDistance; 
     path[i].previous = current.pos; 
     pq.decreaseKey(key); 

यह थोड़ा निरर्थक मूलतः एक ही जानकारी के साथ अपने सरणी और प्राथमिकता कतार अद्यतन करने के लिए लगता है।

मैं वर्तमान में पीक्यू में डेटा संरचना के रूप में एक नियमित सरणी का उपयोग कर रहा हूं। प्राथमिकता को अद्यतन करना रैखिक समय में किया जाता है और रैखिक समय में डेक्यूइंग भी किया जाता है।

प्राथमिकता कतार में मुझे किस डेटा संरचना का उपयोग करना चाहिए और मुझे नोड्स प्राथमिकता को कैसे बदलना चाहिए?

मैं सी ++

उत्तर

1

आपके पास दो प्रकार की दूरी है: आपकी प्राथमिकता कतार में "टेंटेटिव दूरी" है अपडेट के अधीन हैं, जबकि आपकी सरणी में "अंतिम दूरी" है, जो नहीं हैं (क्योंकि डिजस्ट्रा के एल्गोरिदम को प्राथमिकता कतार से हटाए गए नोड्स को अपडेट करने की आवश्यकता नहीं है)।

ऐसा प्रतीत होता है कि आप अनावश्यक रूप से अपनी सरणी में दूरी को अपडेट कर रहे हैं। शायद यह आपके दस्तावेज़ को अपने एरे नोड में फ़ील्ड नाम बदलने के लिए भी एक अच्छा विचार होगा: arrayNode.distance से arrayNode.finalDistance पर।

दूसरे शब्दों में: ऐसा प्रतीत होता है कि आप अपने डीजस्ट्रा के एल्गोरिदम से परिणामों को आउटपुट करने के लिए अपने सरणी नोड्स का उपयोग कर रहे हैं - इसलिए आपको प्राथमिकता कतार से हटा दिए जाने पर केवल प्रत्येक सरणी नोड में दूरी निर्धारित करनी चाहिए।


आपकी प्राथमिकता-कतार कार्यान्वयन वर्तमान किसी कुंजी के साथ जुड़े दूरी क्वेरी करने के लिए क्षमता प्रदान नहीं करता है, अपने decreaseKey() आपरेशन के व्यवहार की जाँच करें। यदि decreaseKey() ऑपरेशन उन अद्यतनों को अस्वीकार करता है जिनके लिए नई प्राथमिकता वास्तव में कम नहीं होती है, तो आपको इसे स्वयं जांचने की आवश्यकता नहीं है - आप इसे वर्तमान नोड के प्रत्येक पड़ोसी के लिए कॉल कर सकते हैं।

हालांकि, decreaseKey() फ़ंक्शन उस मामले को सही तरीके से संभाल नहीं करता है, और कोई सहायक क्वेरी फ़ंक्शन नहीं है जो आपको मैन्युअल रूप से उस चेक को करने देगा, और किसी भी कमी को ठीक करने का कोई मौका नहीं है, तो आपको बनाए रखने की आवश्यकता होगी उस उद्देश्य के लिए अनावश्यक जानकारी ....

+0

मुझे सरणी में दूरी को अद्यतन करना है। अगर मैं अपने पीक्यू से नोड आसन्न नोड्स को बेहतर दूरी दे सकता हूं तो मुझे और कैसे तुलना करना चाहिए? – Carlj901

+0

आदर्श रूप से, आप इसे अपने पीक्यू से देखने में सक्षम होना चाहिए। यदि यह ऑपरेशन अनुपलब्ध है (और आपके पीक्यू कार्यान्वयन में जोड़ा नहीं जा सकता है), तो आपको अनावश्यक जानकारी को बनाए रखने की आवश्यकता होगी। [मैं अपने उत्तर में इस पर एक सेक्शन जोड़ूंगा] – comingstorm

+0

सबसे बेहतर होगा अगर मैं अपने पीक्यू में एक ढेर बनाए रख सकूं और एक हैश फ़ंक्शन हो जो प्रत्येक नोड्स नाम (2 डी सरणी में स्थिति) को इसकी दूरी पर मैप करें। यकीन नहीं है कि मैं इसे कैसे लागू करूंगा। – Carlj901

0

डाटा संरचनाओं जो आप उपयोग कर सकते हैं का उपयोग कर रहा:

हो सकता है कि कुछ अन्य सरणी में कम से कम लगता है।

जब आप नोड को प्राथमिकता देते हैं तो आपको डेटास्ट्रक्चर को सिंक करना होगा जिसे आप पसंद करते हैं।

नोट: आप जुड़े नोड जाँच करने के लिए मैट्रिक्स का उपयोग किया है, तो आप बस डेटा संरचना उपयोग नहीं कर सकते यह algo जटिलता मैं अभी भी हे हो जाएगा परिवर्तन नहीं के रूप में (एन^2) (प्रत्यक्ष साइकिल का उपयोग उचित प्राथमिकता के साथ नोड को खोजने के लिए) डेटा ग्राफ़ प्रभावी है जब आपके पास बहुत सारे नोड्स और कनेक्शन की छोटी मात्रा होती है और कनेक्टेड नोड्स (डिस्चार्ज किए गए ग्राफ़)

+0

मैं एक ढेर में नोड्स प्राथमिकता कैसे अपडेट करूं? – Carlj901

+0

आपको ढेर के अंदर नोड्स के लिंक स्टोर करना होगा, और होंड्स के अंदर नोड्स "चाल" के दौरान इन लिंक को सिंक करें। –

संबंधित मुद्दे