के साथ वस्तुओं की समानता के लिए जाँच करने के लिए कैसे मैं एक चक्रीय ग्राफ जैसी संरचना है कि नोड वस्तुओं का प्रतिनिधित्व करती है की है। ए नोड या तो स्केलर मान (पत्ता) या n> = 1 नोड (आंतरिक नोड) की एक सूची है।हैश और वृत्तीय संदर्भ
संभावित परिपत्र संदर्भों के कारण, मैं बस एक रिकर्सिव हैशकोड() फ़ंक्शन का उपयोग नहीं कर सकता, जो सभी बच्चे नोड्स के हैशकोड() को जोड़ता है: यह एक अनंत रिकर्सन में समाप्त हो जाएगा।
जबकि हैशकोड() भाग कम से कम देखे गए नोड्स को ध्वजांकित और अनदेखा करके कम से कम करने योग्य लगता है, मुझे बराबर() के लिए एक काम करने वाले और कुशल एल्गोरिदम के बारे में सोचने में कुछ परेशानी हो रही है।
मेरे आश्चर्य के लिए मुझे इसके बारे में कोई उपयोगी जानकारी नहीं मिली, लेकिन मुझे यकीन है कि कई स्मार्ट लोगों ने इन समस्याओं को हल करने के अच्छे तरीकों के बारे में सोचा है ... सही?
उदाहरण (अजगर): क्योंकि यह बिल्कुल वैसा ही ग्राफ का प्रतिनिधित्व करता है
A = [ 1, 2, None ]; A[2] = A
B = [ 1, 2, None ]; B[2] = B
ए, बी के बराबर है।
बीटीडब्ल्यू। यह प्रश्न किसी भी विशिष्ट भाषा को लक्षित नहीं है, लेकिन जावा में वर्णित नोड ऑब्जेक्ट के लिए हैशकोड() और बराबर() को कार्यान्वित करना एक अच्छा व्यावहारिक उदाहरण होगा।
आपकी प्रतिक्रिया के लिए धन्यवाद, हालांकि यह वास्तव में मेरी मदद नहीं करता है: – mfya
मैं अपने सभी बच्चों के हैश को जानने से पहले नोड के हैश की गणना नहीं कर सकता। बीएफएस या डीएफएस के साथ मैं अनंत रिकर्सन से बच सकता हूं, लेकिन चक्र होने पर हैश मुझे अच्छा नहीं हो सकता है: उदाहरण के लिए, जब मैं नोड्स को अनदेखा करता हूं तो मुझे दूसरी बार दिखाई देता है, नोड का हैश समान होगा चक्र के बिना एक नोड के रूप में। मैं कुछ हैशिंग एल्गोरिदम की तलाश में था जो समझ में आता है और अनावश्यक टकराव नहीं करता है (यदि यह इस मामले के लिए मौजूद है)। – mfya