आप उन set
राज्यों को संग्रहीत करने के लिए एक (शब्द के गणितीय अर्थ में, अर्थात एक संग्रह जिसमें डुप्लिकेट शामिल नहीं कर सकते हैं) का उपयोग कर सकते हैं जो आपने पहले ही देखा है। इस पर आपको जो संचालन करने की आवश्यकता होगी, वे हैं:
- तत्वों को सम्मिलित करना
- तत्वों में पहले से ही अगर परीक्षण कर रहे हैं
बहुत अधिक हर प्रोग्रामिंग भाषा में पहले से ही एक डेटा संरचना का समर्थन होना चाहिए जो इन दोनों कार्यों को निरंतर रूप से कर सकता है (O(1)) समय। उदाहरण के लिए:
set
अजगर में
HashSet
जावा में
पहली नज़र में, यह आपको उन सभी राज्यों को जोड़ने जैसा प्रतीत हो सकता है जिन्हें आप कभी सेट पर देखते हैं जैसे कि यह महंगा मेमोरी-वार होगा, लेकिन यह आपके मेमोरी के लिए पहले से ही आवश्यक मेमोरी की तुलना में बहुत बुरा नहीं है; अगर आपकी ब्रांचिंग फैक्टर हैb, आपके सीमांत से विकास होगा b−1 प्रति नोड तत्व जो आप जाते हैं (निकालें) 1 सीमांत से "इसे" पर जाएं, जोड़ें b नए उत्तराधिकारी / बच्चे), जबकि आपका सेट केवल बढ़ेगा 1 अतिरिक्त नोड प्रति विज़िट नोड।
स्यूडोकोड में, इस तरह के एक सेट (आइए इसे नाम दें closed_set
, विकिपीडिया पर छद्मकोड के अनुरूप होने के लिए चौड़ाई-प्रथम खोज में उपयोग किया जा सकता है:
frontier = First-In-First-Out Queue
frontier.add(initial_state)
closed_set = set()
while frontier not empty:
current = frontier.remove_next()
if current == goal_state:
return something
for each child in current.generate_children()
if child not in closed_set: // This operation should be supported in O(1) time regardless of closed_set's current size
frontier.add(child)
closed_set.add(current) // this should also run in O(1) time
(इस छद्मकोश के कुछ रूपांतर भी काम कर सकते हैं, और स्थिति के आधार पर कम या ज्यादा कुशल हो सकते हैं; उदाहरण के लिए, आप closed_set
उन सभी नोडों को भी ले सकते हैं जिनमें आपने पहले से ही बच्चों को जोड़ा है, और फिर पूरी तरह से generate_children()
कॉल से बचें यदि current
पहले से है closed_set
।)
ऊपर वर्णित मैंने इस समस्या को संभालने के लिए मानक तरीका होगा। वास्तव में, मुझे संदेह है कि एक अलग "समाधान" हमेशा उत्तराधिकारी राज्यों की एक नई सूची के क्रम को सीमांत में जोड़ने से पहले यादृच्छिक कर सकता है। इस तरह, आप कभी-कभी राज्यों को जोड़ने की समस्या से नहीं बचते हैं जो आप पहले से ही सीमा तक विस्तारित हो चुके हैं, लेकिन मुझे लगता है कि इसे अनंत चक्रों में फंसने के जोखिम को काफी कम करना चाहिए।
सावधान रहें : मुझे इस समाधान के किसी भी औपचारिक विश्लेषण के बारे में नहीं पता है जो यह साबित करता है कि यह हमेशा अनंत चक्रों से बचता है। यदि मैं अपने सिर के माध्यम से इसे "चलाने" की कोशिश करता हूं, तो सहज रूप से, मुझे संदेह है कि इसे काम करना चाहिए, और इसके लिए किसी अतिरिक्त मेमोरी की आवश्यकता नहीं है। ऐसे किनारे मामले हो सकते हैं जो मैं अभी नहीं सोच रहा हूं, लेकिन यह भी बस काम नहीं कर सकता है, ऊपर वर्णित मानक समाधान एक सुरक्षित शर्त (अधिक मेमोरी की कीमत पर) होगा।