আমি একমত:
- ও এর সাধারণ মোড়কযুক্ত জটিলতা (1)
- একটি খারাপ
hashCode()
বাস্তবায়ন একাধিক সংঘর্ষে ডেকে আনে, যার অর্থ দাঁড়ায় যে সবচেয়ে খারাপ ক্ষেত্রে প্রতিটি বস্তু একই বালতিতে চলে যায়, সুতরাং O ( N ) যদি প্রতিটি বালতি একটি দ্বারা সমর্থিত হয় List
।
- জাভা 8-এর পর থেকে,
HashMap
প্রতিটি বালতিতে ব্যবহৃত নোডগুলি (সংযুক্ত তালিকার) গতিশীলভাবে প্রতিস্থাপন করে TreeNodes (লাল-কালো গাছ যখন একটি তালিকা 8 টিরও বেশি উপাদানের চেয়ে বড় হয়ে যায়) এর ফলে ও ( লগএন ) এর সবচেয়ে খারাপ কার্য সম্পাদন করে ।
তবে, আমরা যদি 100% সুনির্দিষ্ট হতে চাই তবে এটি সম্পূর্ণ সত্য নয়। hashCode()
কী এবং প্রয়োগ Object
(অপরিবর্তনীয় / ক্যাশেড বা সংগ্রহ হওয়া) এর ধরণটি কড়া শর্তে প্রকৃত জটিলতায়ও প্রভাব ফেলতে পারে।
আসুন নিম্নলিখিত তিনটি ক্ষেত্রে ধরে নেওয়া যাক:
HashMap<Integer, V>
HashMap<String, V>
HashMap<List<E>, V>
তাদের কি একই জটিলতা আছে? ঠিক আছে, 1 ম এর মোড়িত জটিলতা প্রত্যাশার মতো, হে (1)। তবে, বিশ্রামের জন্য, আমাদের hashCode()
অনুসন্ধান উপাদানটির গণনাও করা দরকার , যার অর্থ আমাদের অ্যালগরিদমে অ্যারে এবং তালিকাগুলি অতিক্রম করতে হতে পারে।
ধরে নেওয়া যাক উপরের সমস্ত অ্যারে / তালিকাগুলির আকার কে । তারপরে HashMap<String, V>
এবং এর মধ্যে HashMap<List<E>, V>
ও (কে) মোতাবিভক্ত জটিলতা হবে এবং তেমনি জাভা 8-এ ও ( কে + লগএন ) সবচেয়ে খারাপ পরিস্থিতি হবে।
* নোট করুন যে String
কীটি ব্যবহার করা আরও জটিল কেস, কারণ এটি পরিবর্তনযোগ্য এবং জাভা hashCode()
একটি ব্যক্তিগত ভেরিয়েবলের ফলাফলকে ক্যাশে করে hash
, তাই এটি কেবল একবারই গণনা করা হয়েছে।
/** Cache the hash code for the string */
private int hash; // Default to 0
তবে, উপরেরটির নিজস্ব খারাপ পরিস্থিতিও রয়েছে, কারণ জাভাটির String.hashCode()
বাস্তবায়ন hash == 0
গণনা করার আগে পরীক্ষা করছে কিনা hashCode
। তবে ওহে, এমন hashcode
শূন্য নক্ষত্র রয়েছে যা শূন্যের আউটপুট দেয় , যেমন "f5a5a608", এখানে দেখুন , এই ক্ষেত্রে স্মৃতিচারণ সহায়ক হতে পারে না।