नंबर-हॉपर भूलभुलैया का समाधान


18

मेरे 8 साल पुराने पारंपरिक mazes बनाने ऊब गया है, और इस तरह लग रहे वेरिएंट बनाने के लिए ले लिया है:

नंबर हॉपर नमूना

विचार एक्स से शुरू करना है और सामान्य नियमों के माध्यम से ओ तक पहुंचना है। साथ ही, आप पूर्णांक किसी से "हॉप" कर सकते हैं किसी अन्य पूर्णांक तक , लेकिन आप भुगतान करना होगा | a - बी | विशेषाधिकार के लिए डॉलर। लक्ष्य कम से कम लागत के लिए भूलभुलैया को हल करना है। ऊपर दिए गए उदाहरण में, हम x से o तक x 14-18-27-28- o के माध्यम से लागत 5 पर जा सकते हैं, लेकिन केवल x-13-11-9-8-29-28-o पर जाना सस्ता है 4।ab|ab|

तो यहाँ मेरा सवाल है: सबसे अच्छा समाधान (asymptotic चल रहे समय के संदर्भ में) आप इसे हल करने के लिए क्या सोच सकते हैं? आप इनपुट प्रारूप के बारे में कोई उचित अनुमान लगा सकते हैं।

नोट: मैं यहाँ "पज़ल" टैग का उपयोग कर रहा हूँ क्योंकि मेरे पास एक उत्तर है, लेकिन मुझे यकीन नहीं है कि यह इष्टतम है और यह देखना चाहेगा कि कोई और मेरा समाधान सुधार सकता है या नहीं। (यहाँ n भूलभुलैया में पूर्णांक की संख्या है।)O(n2)n


7
इस तरह की रचनात्मक और गणितीय पहेलियाँ बनाने के लिए अपने बच्चे को सहारा!
bbejot

2
@bbejot आपको मेरे द्वारा पूछे गए कुछ सामानों को देखना चाहिए ... कभी-कभी मैं उनके सवालों का जवाब नहीं दे सकता। जैसे, math.stackexchange.com/questions/33094/…
फिक्सी

1
मुझे यकीन नहीं है कि आपकी लागत की गणना सही है। x-14-18-27-28- o की लागत और x-13-11-9-8-29-28-o की लागत 2 + 2 + 1 + 21 + 1 = 27 होनी चाहिए । 4+9+1=142+2+1+21+1=27
डेव क्लार्क

1
@ नहीं संक्रमण के सभी कूद रहे हैं। हम छलांग के लिए 'अब' (जो की लागत राशि लिख सकता है चलने के लिए ग्राफ में एक और 'a-> ख' बी (जो की लागत है) 0 है, जो केवल यदि अनुमति दी है) वे भूलभुलैया में एक दीवार को तोड़े बिना पहुंच योग्य हैं। इस अंकन में हमारे पास x-> 14-18-> 27-28-> o और 5 और x-> 13-11-> 9-8-> 29-28-> ओ की लागत है। मैंने पतली फ़िक्की को निरर्थक होने के कारण इस संकेतन का परिचय नहीं दिया: दो बार आशा करने का कोई कारण नहीं है और इस प्रकार हॉप्स और वॉक वैकल्पिक रूप से चलेंगे। |ab|0
Artem Kaznatcheev

2
यह एक उत्कृष्ट होमवर्क समस्या है!
जेफ

जवाबों:


15

आप इस का समाधान कर सकते समय डिज्कस्ट्रा एल्गोरिथ्म के एक परिवर्तन का उपयोग। जब हम किसी नए नोड पर जाते हैं तो हम सभी दूरी अपडेट नहीं कर सकते हैं। अगर हम एक नोड पर जाएँ y , हम से सब कुछ चलने योग्य की दूरी अद्यतन करने के लिए केवल जरूरत y 0 के लिए, और दो नोड्स के लिए दूरी अद्यतन करने के लिए y - और y + के सबसे करीब मूल्यों के साथ y कम और अधिक से अधिक y जो नहीं अभी तक उठाया गया है।O(nlogn)yyyy+yy

ये अपडेट न्यूनतम तत्व को वापस लाने के लिए पर्याप्त हैं क्योंकि आपके द्वारा कूदने वाले किसी भी निकटतम नोड को संख्यात्मक रूप से ऊपर या पहले से देखे गए नोड के ठीक नीचे होना चाहिए।

प्रत्येक नोड को एक बार में 0 पर अपडेट किया जाता है (यदि हम द्विघात से बचने के लिए कतार से सभी शून्य दूरी नोड्स को पॉप आउट करते हैं), और हर बार जब हम एक नोड जोड़ते हैं, तो हम केवल ओ (1) अन्य अपडेट करते हैं। मानों को खोजना और y + को रैखिक समय में किया जा सकता है यदि हम सभी पूर्णांक मानों के अनुसार क्रमबद्ध सभी नोड्स की एक क्रमबद्ध दोगुनी-लिंक्ड सूची रखते हैं। इस दोहरी-लिंक सूची को बनाने में O ( n) लगता हैyy+ समय, और अंत में हे ( एन ) ढेर ले से करने के लिए अद्यतन और पॉप करता हे ( एन लॉग इन करें n ) समय, की कुल क्रम के लिए हे (O(nlogn)O(n)O(nlogn)O(nlogn)


इसे संभवतः छँटाई और प्राथमिकता वाले कतारों का उपयोग करके थोड़ा सुधार किया जा सकता है जो पूर्णांकों के लिए विशिष्ट हैं, लेकिन आप पूर्णांक छँटाई से बेहतर नहीं कर सकते हैं, जैसा कि निम्नलिखित कमी द्वारा देखा जा सकता है: यदि हमारे पास पूर्णांक मानों की सूची है , x को इनमें से न्यूनतम दो बार और को अधिकतम दो बार होने के लिए सेट करें। मानों के साथ एक क्षेत्र बनाएं 2 x i और 2 x i + 1 एक दूसरे के लिए x i । सबसे अच्छा समाधान x i द्वारा सॉर्ट किए गए क्रम में प्रत्येक क्षेत्र से गुजरता है , और इस प्रकार एक छँटाई का उत्पादन करता हैx1,,xnxo2xi2xi+1xixixi मान
डेव

डेव सही है, इसे केवल y + और y - को अपडेट करके तक कम किया जा सकता है । इसके अलावा, एक क्षेत्र में प्रत्येक नोड को क्षेत्र के प्रत्येक दूसरे नोड से जोड़ने के बजाय, उन्हें केवल क्षेत्र में 1 या 2 अन्य नोड्स (पथ बनाने) से जुड़ा होना चाहिए। इस प्रकार, प्रत्येक नोड में केवल 4 किनारे होते हैं। तब दीजकस्ट्रा के एल्गोरिथ्म (एक न्यूनतम प्राथमिकता कतार के साथ) शायद हे ( एन एल जी एन ) समय देने के लिए आवेदन किया । O(nlgn)y+yO(nlgn)
बबजोत

@bbejot: लेकिन अगर ऐसा है, तो थोरुप द्वारा अभिन्न प्राथमिकता कतार अप्रत्यक्ष स्थिति में कुछ अतिरिक्त बकेटिंग तकनीक के साथ , या यहां तक ​​कि ( एन ) के लिए चल रहे समय में सुधार नहीं करता है? O(nloglogn)O(n)
Hsien-Chih चांग 張顯 '

4

मुझे लगता है कि सबसे अच्छा हो सकता है जिसे आप प्राप्त कर सकते हैं।O(n2)

यह एक विशेष शुरुआती नोड (एक्स) और समाप्ति नोड (0) के साथ सबसे छोटी पथ समस्या में परिवर्तित करना स्वाभाविक लगता है। प्रत्येक संख्या के लिए एक दूसरे का नोड भी होगा। X और 0 दोनों के वजन 0 से सभी संख्या के नोड्स के किनारे हैं जो भूलभुलैया में उपलब्ध हैं। सभी संख्या नोड या तो वजन 0 से जुड़े हुए हैं (यदि संख्याएं भूलभुलैया से उपलब्ध हैं) या अंकों के बीच अंतर के साथ (यदि भूलभुलैया उपलब्ध नहीं हैं)।

इस ग्राफ़ में सबसे छोटा रास्ता से कम में हल नहीं किया जा सकता है क्योंकि ग्राफ़ में लगभग n 2 किनारे हैं और, सबसे खराब स्थिति में, हर मामले को एक बार देखना होगा। इस तरह, सबसे छोटे रास्ते के लिए डायजकस्ट्रा एल्गोरिथ्म में ( एन 2 ) समय लगता है और यह सबसे खराब स्थिति है।O(n2)n2O(n2)


यह वह उत्तर है जो मेरे मन में था; निश्चित रूप से, आपको रनिंग टाइम प्राप्त करने के लिए डेज्क्स्ट्रा के एल्गोरिथ्म के साथ उचित डेटा संरचना का उपयोग करना होगा । विशिष्ट बाइनरी हीप का उपयोग करने से O ( n 2 lg n ) प्राप्त होगाO(n2)O(n2lgn)
फिक्सि

1
rO(r2)

O(nlogn)O(r2+nlogn)Ω(nlogn)

Ω(n2)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.