मैं सहमत हूं:
- O (1) की सामान्य परिशोधन जटिलता
- एक खराब
hashCode()
कार्यान्वयन कई टकरावों का परिणाम हो सकता है, जिसका अर्थ है कि सबसे खराब स्थिति में प्रत्येक वस्तु एक ही बाल्टी में जाती है, इस प्रकार ओ ( एन ) यदि प्रत्येक बाल्टी एक द्वारा समर्थित है List
।
- चूंकि जावा 8,
HashMap
डायनेमिक रूप से प्रत्येक बकेट में इस्तेमाल किए गए नोड्स (लिंक्ड लिस्ट) को ट्रीनोड्स (लाल-काला पेड़ जब एक सूची 8 तत्वों से बड़ा हो जाता है) की जगह लेती है, जिसके परिणामस्वरूप ओ ( लॉगएन ) का सबसे खराब प्रदर्शन होता है ।
लेकिन, यह पूर्ण सत्य नहीं है यदि हम 100% सटीक होना चाहते हैं। कार्यान्वयन hashCode()
और कुंजी के प्रकार Object
(अपरिवर्तनीय / कैशेड या एक संग्रह होने के नाते) भी सख्त शब्दों में वास्तविक जटिलता को प्रभावित कर सकते हैं।
आइए निम्नलिखित तीन मामलों को मानें:
HashMap<Integer, V>
HashMap<String, V>
HashMap<List<E>, V>
क्या उनमें एक ही जटिलता है? ठीक है, 1 की परिशोधित जटिलता, उम्मीद के मुताबिक, ओ (1) है। लेकिन, बाकी के लिए, हमें hashCode()
लुकअप तत्व की गणना करने की आवश्यकता है , जिसका अर्थ है कि हमें अपने एल्गोरिथ्म में सरणियों और सूचियों का पता लगाना होगा।
मान लेते हैं कि उपरोक्त सभी सरणियों / सूचियों का आकार k है । फिर, HashMap<String, V>
और HashMap<List<E>, V>
O (k) परिमित जटिलता होगी और इसी तरह, Java8 में O ( k + logN ) सबसे खराब स्थिति है।
* ध्यान दें कि String
कुंजी का उपयोग करना अधिक जटिल मामला है, क्योंकि यह अपरिवर्तनीय है और जावा hashCode()
एक निजी चर में परिणाम देता है hash
, इसलिए यह केवल एक बार गणना की जाती है।
/** Cache the hash code for the string */
private int hash; // Default to 0
लेकिन, उपरोक्त भी अपना सबसे खराब मामला है, क्योंकि कंप्यूटिंग से पहले जावा का String.hashCode()
कार्यान्वयन जाँच कर रहा है । लेकिन हे, ऐसे गैर-रिक्त स्ट्रिंग्स हैं जो शून्य का उत्पादन करते हैं, जैसे कि "f5a5a608", यहां देखें , जिसमें संस्मरण सहायक नहीं हो सकता है।hash == 0
hashCode
hashcode