मैं रिकर्सिव एल्गोरिदम का उपयोग कर डीएफएस पेड़ बनाने की कोशिश कर रहा हूं। इस के लिएहास्केल में स्थिर डेटा का प्रतिनिधित्व करने का कोई तरीका है? या हैस्केल में डीएफएस ट्रैवर्सल के लिए कोई अन्य सुरुचिपूर्ण एल्गोरिदम है?
छद्म कोड है:
DFF(G)
Mark all nodes u as unvisited
while there is an unvisited node u do
DFS(u)
।
DFS(u)
Mark u as visited
for each v in u's neighbor do
if v is not marked
DFS(v)
जबकि मैं काफी आसानी से इस सरल तरीके से अनिवार्य भाषा में, संयुक्त राष्ट्र/दौरा नोड्स के लिए डेटा संरचना में किसी प्रकार का निर्माण उन्हें गतिशील आवंटन या घोषणा के कुछ प्रकार, हास्केल के लिए बताए द्वारा पूरा कर सकते हैं, यह असंभव है ऐसा इसलिए करें क्योंकि हास्केल की शुद्धता मुझे पैरामीटर पास करते समय डेटा बदलने के लिए रोकती है।
data Graph a = Graph [(a,[a])] deriving (Ord, Eq, Show)
data Tree a = Node a [Tree a] deriving (Ord, Eq, Show)
type Point = (Int, Int)
type Edges = [Point]
type Path = [Point]
pathGraphFy :: Graph Point -> Point -> Tree (Point,Path)
pathGraphFy inputGraph point = getPathVertex inputGraph (point,[])
getPathVertex :: Graph Point -> (Point, Path) -> Tree (Point,Path)
getPathVertex inputGraph (point,path) =
Node (point,point:path) (map (getPathVertex inputGraph) [(x,(point:path)) | x<- neighbors, x `notElem` path])
where neighbors = pointNeighbor inputGraph point
pointNeighbor :: Graph Point -> Point -> Edges
pointNeighbor (Graph (x:xs)) point =
if fst x == point then snd x else pointNeighbor (Graph(xs)) point
यह है कि मैं क्या डीएफएस-ish (या बल्कि BFS-ish) कलन विधि का उपयोग ग्राफ ट्रेवर्सल के लिए मिल गया है है, लेकिन समस्या यह है कि यह सभी बिंदुओं फिर से दौरा करेंगे कि 'अंक रास्ते में नहीं है। (यानी यदि कोई चक्र मौजूद है, तो यह घड़ी के विपरीत और विपरीत दिशा में दोनों तरफ घुमाएगा)
मैंने विज़िट किए गए बिंदुओं के साथ एक और ग्राफ को घुमाने का भी प्रयास किया है, लेकिन विफल रहा है क्योंकि पैरामीटर द्वारा पारित ग्राफ केवल ट्रैवर्सल में ग्राफ का डेटा रखता है (यानी वैश्विक नहीं है)
यदि वैश्विक स्तर के लिए डेटा रखने के लिए केवल गतिशील आवंटन या स्थैतिक डेटा संभव था, तो इसे आसानी से हल किया जा सकता है लेकिन मैं हास्केल के लिए नया हूं और मुझे इस पर वेब पर जवाब नहीं मिल सका मुद्दा। कृपया मेरी मदद करें :(अग्रिम धन्यवाद।
(पीएस) मैंने विज़िट किए गए नोड्स की गुजरने वाली सूची का उपयोग करने का प्रयास किया है, लेकिन यह काम नहीं करता है क्योंकि जब रिकर्सन रिटर्न मिलता है, तो विज़िट किए गए नोड्स की सूची भी वापस आ जाएगी, जिससे यह असंभव हो जाएगा डेटा को ट्रैक करने के लिए। यदि 'मानचित्र' या 'सूची' ग्लोबल बनाने का कोई तरीका है, तो इसे इस तरह कार्यान्वित करना संभव है। नीचे दिए गए उत्तर के बावजूद उत्तर दें, इस कारण पर बहुत अच्छा स्पष्टीकरण है कि यह क्यों नहीं हो सकता (या नहीं किया जाना चाहिए) लागू किया
उत्तर के लिए धन्यवाद, मैं अपने प्रश्न के उत्तर के रूप में सभी उत्तरों चुनना चाहता हूं लेकिन चूंकि यह सबसे सरल और सामान्यीकृत उत्तर है, इसलिए मैं इसे उत्तर के रूप में ले जाऊंगा। एक बार फिर धन्यवाद। – MazaYong
वाह यह मेरे सिर को लपेटने के लिए कुछ गंभीर झुकने की आवश्यकता है। मैं अभी भी समझ में नहीं आता कि वे किस प्रकार गए राज्य को एन्कोड करते हैं, फिर से उस पेपर को देखना होगा। इस अवधारणा को पेश करने के लिए अच्छा उदाहरण और धन्यवाद! –
@ निकलासबी। निहित ग्राफ के बारे में वास्तव में चालाक बात यह है कि विज़िट किए गए राज्य को एन्कोड नहीं किया जाना चाहिए। फ़ंक्शन 'मिलान' 'v' पर ग्राफ के एक * अपघटन * का उत्पादन करता है: उदाहरण में ग्राफ़ 'g'' वह ग्राफ है जिसमें 'v' को छोड़कर सभी कोष्ठक होते हैं, और सभी किनारों 'v' सहित उनको छोड़कर। ऐसा इसलिए है क्योंकि ग्राफ अनिवार्य रूप से संदर्भों की एक सूची है, इसलिए कोई भी दिए गए संदर्भ को हटा सकता है (स्पष्ट रूप से यह एक कुशल तरीके से अपरिवर्तनीय डेटा के साथ ऐसा करना गैर-तुच्छ है, लेकिन यही पुस्तकालय हैं :-)) – jjm