यदि आप बस जानना चाहते हैं कि क्या सेट बराबर हैं, तो equals
विधि AbstractSet
को नीचे के रूप में लागू किया गया है:
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof Set))
return false;
Collection c = (Collection) o;
if (c.size() != size())
return false;
return containsAll(c);
}
ध्यान दें कि यह आम मामलों का अनुकूलन कैसे करता है:
- दो वस्तुएं समान हैं
- दूसरी वस्तु बिल्कुल भी सेट नहीं है, और
- दो सेट के आकार अलग हैं।
उसके बाद, जैसे ही यह दूसरे सेट में एक तत्व पाता है, जो इस सेट में भी नहीं है, containsAll(...)
वापस आ जाएगा false
। लेकिन अगर सभी तत्व दोनों सेटों में मौजूद हैं, तो उन सभी का परीक्षण करने की आवश्यकता होगी।
सबसे खराब स्थिति प्रदर्शन तब होता है जब दो सेट समान होते हैं लेकिन समान वस्तु नहीं होती है। वह लागत आमतौर पर O(N)
या O(NlogN)
कार्यान्वयन के आधार पर होती है this.containsAll(c)
।
और अगर आप सेट बड़े हैं और तत्वों के एक छोटे प्रतिशत में भिन्न होते हैं, तो आपको सबसे खराब स्थिति मिलती है।
अपडेट करें
यदि आप कस्टम सेट कार्यान्वयन में समय लगाने के इच्छुक हैं, तो एक दृष्टिकोण है जो "लगभग समान" मामले में सुधार कर सकता है।
विचार यह है कि आपको पूरे सेट के लिए एक हैश पूर्व-गणना और कैश करने की आवश्यकता है ताकि आप सेट के वर्तमान हैशकोड को प्राप्त कर सकें O(1)
। फिर आप एक त्वरण के रूप में दो सेट के लिए हैशकोड की तुलना कर सकते हैं।
आप इस तरह से हैशकोड कैसे लागू कर सकते हैं? खैर अगर सेट हैशकोड था:
- एक खाली सेट के लिए शून्य, और
- गैर-खाली सेट के लिए सभी तत्व हैशकोड का XOR,
तब आप सस्ते में सेट के कैश्ड हैशकोड को हर बार अपडेट कर सकते हैं जब आप एक तत्व को जोड़ते या हटाते हैं। दोनों ही मामलों में, आप बस वर्तमान सेट हैशकोड के साथ तत्व के हैशकोड को XOR करते हैं।
बेशक, यह मानता है कि तत्व हैशकोड स्थिर हैं, जबकि तत्व सेट के सदस्य हैं। यह भी मानता है कि तत्व वर्ग हैशकोड फ़ंक्शन एक अच्छा प्रसार देता है। ऐसा इसलिए है क्योंकि जब दो सेट हैशकोड समान होते हैं तब भी आपको O(N)
सभी तत्वों की तुलना में वापस आना पड़ता है ।
आप इस विचार को थोड़ा और आगे ले जा सकते हैं ... कम से कम सिद्धांत में।
चेतावनी - यह अत्यधिक सट्टा है। यदि आप चाहें तो एक "विचार प्रयोग"।
मान लें कि आपके सेट तत्व वर्ग में तत्व के लिए एक क्रिप्टो चेकसम वापस करने की विधि है। अब तत्वों के लिए लौटे चेकसमों को XORING द्वारा सेट के चेकसमों को लागू करें।
यह हमें क्या खरीदता है?
ठीक है, अगर हम मानते हैं कि कुछ भी नहीं चल रहा है, तो संभावना है कि किसी भी दो असमान सेट तत्वों में समान एन-बिट चेकसम 2- एन है । और संभावना 2 असमान सेटों में समान एन-बिट चेकसम भी 2- एन है । इसलिए मेरा विचार यह है कि आप इसे लागू कर सकते हैं equals
:
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof Set))
return false;
Collection c = (Collection) o;
if (c.size() != size())
return false;
return checksums.equals(c.checksums);
}
उपरोक्त मान्यताओं के तहत, यह आपको केवल 2- एन समय में एक बार गलत उत्तर देगा । यदि आप N को पर्याप्त बड़ा बनाते हैं (जैसे 512 बिट्स) तो एक गलत उत्तर की संभावना नगण्य हो जाती है (जैसे लगभग 10 -150 )।
नकारात्मक पक्ष यह है कि तत्वों के लिए क्रिप्टो चेकसमों की गणना करना बहुत महंगा है, खासकर जब बिट्स की संख्या बढ़ जाती है। तो आप वास्तव में चेकसम याद करने के लिए एक प्रभावी तंत्र की जरूरत है। और यह समस्याग्रस्त हो सकता है।
और अन्य नकारात्मक पक्ष यह है कि त्रुटि की एक गैर-शून्य संभावना अस्वीकार्य हो सकती है, चाहे कितनी भी छोटी संभावना हो। (लेकिन अगर यह मामला है ... आप उस मामले से कैसे निपटते हैं जहां एक लौकिक किरण एक महत्वपूर्ण बिट को फ़्लिप करती है? या यदि यह एक ही तरह से एक बेमानी प्रणाली के दो उदाहरणों में फ़्लिप करता है?)