मैं अर्थ वे है कि बच्चों की एक ही नंबर है, तो दो नोड्स ही कर रहे हैं की जाँच करने की कोशिश कर रहा हूँ,, और कहा कि उन बच्चों को ठीक उसी राज्यों के लिए सीसा। इसलिए, मैं प्रभावी ढंग से दो नोड पर उपट्री की तुलना करने की कोशिश कर रहा हूं। मुझे आश्चर्य है कि क्या मैं इस समानता जांच करने के लिए हैशिंग का उपयोग कर सकता हूं।
नहीं, समानता की जांच के लिए हैशिंग का उपयोग नहीं किया जाना चाहिए। यह इसका उद्देश्य नहीं है। अंततः यह पता लगाने में आपकी सहायता कर सकता है कि क्या वस्तुएं बराबर नहीं हैं, लेकिन यदि वे बराबर हैं तो यह आपको कुछ भी नहीं बताएगा।
वही ऑब्जेक्ट्स समान हैश मान उत्पन्न करेगा, लेकिन दो अलग-अलग ऑब्जेक्ट्स जो समान नहीं हैं, वही हैश भी उत्पन्न कर सकते हैं।दूसरे शब्दों में, यदि हैश मान अलग हैं, तो आप निश्चित रूप से जानते हैं कि ऑब्जेक्ट अलग हैं। बस।
यदि आप समानता का परीक्षण करना चाहते हैं, तो आपको बराबर लागू करने की आवश्यकता है। आपके मामले में, एक खतरा है कि आपकी विधि रिकर्सिव हो जाएगी और एक स्टैक ओवरफ़्लो उकसाएगी। क्या होगा यदि आपकी ऑब्जेक्ट में स्वयं का संदर्भ है?
यदि आप हैश उत्पन्न करना चाहते हैं, तो आप सरणी का आकार खाते में ले सकते हैं (और तथ्य यह है कि यह शून्य है या नहीं), लेकिन मैं सरणी में ऑब्जेक्ट्स के हैश मान का उपयोग करने की कोशिश नहीं करता , संभावित अनंत लूप की वजह से। यह सही नहीं है, लेकिन यह काफी अच्छा है।
एक और कट्टरपंथी विधि है जो भी अच्छे परिणाम प्रदान कर सकती है। हैश मानों को गतिशील रूप से कंप्यूटिंग करने के बजाय, प्रत्येक नोड ऑब्जेक्ट इंस्टेंस के लिए एक यादृच्छिक int मान सेट करें (मेरा मतलब है सृजन पर सभी के लिए और हमेशा उस मान को वापस करें)। आपके मामले में, आप अपने सरणी में ऑब्जेक्ट इंस्टेंस के हैश मान को लेकर अनंत लूप का जोखिम नहीं उठाएंगे।
यदि हैश बराबर हैं, तो आपको सरणी ऑब्जेक्ट उदाहरणों की तुलना करना प्रारंभ करना होगा।
आरईएम: यदि नोड्स में अन्य विशेषताएं हैं, तो इन अन्य विशेषताओं पर हैश की गणना करें और सरणी के बारे में भूल जाएं। सरणी सामग्री/आकार के बारे में जांच करना शुरू करें यदि केवल और यदि हैश दो ऑब्जेक्ट्स के बीच समान हैं।
आरईएम 2: टिप्पणियां डीएजी ग्राफ का उल्लेख करती हैं, जिसका अर्थ है कि हम रिकर्सिविटी मुद्दों को नहीं मारेंगे। हालांकि, यह शर्त पर्याप्त नहीं है जो गारंटी देता है कि deepHashCode() सफल होगा। इसके अलावा, यह भी अधिक होगा। इस मुद्दे को हल करने के लिए एक और अधिक प्रभावी तरीका है।
यदि नोड द्वारा उपयोग की गई हैश विधि केवल हैश मान की गणना करने के लिए सरणी का उपयोग करती है, तो deepHashCode() काम कर सकता है। लेकिन यह कुशल नहीं होगा। यदि हैश विधि अन्य नोड विशेषताओं का उपयोग करती है, तो इन विशेषताओं को भी बराबर होना होगा।
समानता के लिए नोड्स की तुलना करने का एक तेज़ तरीका है। प्रत्येक नोड इंस्टेंस को एक अद्वितीय संख्या के साथ चिह्नित करें। फिर, दो नोड्स की तुलना करने के लिए, पहले अपने सरणी आकार की तुलना करें। यदि यह बराबर है, तो प्रत्येक अद्वितीय से अपने अद्वितीय संख्या का उपयोग करके नोड्स की तुलना करें। यदि एक सरणी में अन्य नोड नहीं है, तो हम बराबर नोड्स से निपट नहीं रहे हैं। यह समाधान रिकर्सिव जाने से कहीं ज्यादा तेज है।
मुझे लगता है कि आप नोड्स के पेड़ को किसी बिंदु पर समाप्त करते हैं और अनंत नहीं हैं? – justkt
हाँ, यह समाप्त हो जाता है। – efficiencyIsBliss
@ दक्षताIsBliss - जब तक कोई भी बच्चा नोड्स पैरेंट नोड्स को संदर्भित करता है, तब तक आप सरणी पर deepHashCode और deepEquals का उपयोग करने में सक्षम होना चाहिए। – justkt