যদি আপনি কেবল সেটগুলি সমান কিনা তা জানতে চান, তবে 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);
}
এটি কীভাবে সাধারণ কেসগুলিকে অনুকূল করে তোলে তা নোট করুন:
- দুটি বস্তু একই
- অন্য বস্তু মোটেই সেট নয়, এবং is
- দুটি সেটের মাপ আলাদা।
এর পর, containsAll(...)
ফিরে আসবে false
যেমন অন্যান্য সেট যে এই সেট এ নয় একটি উপাদান খুঁজে বের করে যত তাড়াতাড়ি। তবে সমস্ত উপাদান উভয় সেটে উপস্থিত থাকলে, এটির সমস্তটি পরীক্ষা করা দরকার।
সবচেয়ে খারাপ ক্ষেত্রে পারফরম্যান্স ঘটে যখন দুটি সেট সমান হয় তবে একই বস্তু নয়। এই ব্যয়টি সাধারণত O(N)
বা O(NlogN)
বাস্তবায়নের উপর নির্ভর করে this.containsAll(c)
।
এবং যদি সেটগুলি বড় হয় এবং কেবলমাত্র উপাদানের ক্ষুদ্র শতাংশে পৃথক হয় তবে আপনি নিকট থেকে খারাপের ক্ষেত্রে পারফরম্যান্স পাবেন।
হালনাগাদ
আপনি যদি কাস্টম সেট বাস্তবায়নে সময় বিনিয়োগ করতে ইচ্ছুক থাকেন তবে এমন একটি পন্থা রয়েছে যা "প্রায় একই" ক্ষেত্রে উন্নতি করতে পারে।
ধারণাটি হ'ল আপনাকে পুরো সেটটির জন্য প্রাক-গণনা এবং একটি হ্যাশ ক্যাশে করা দরকার যাতে আপনি সেটটির বর্তমান হ্যাশকোড মানটি পেতে পারেন O(1)
। তারপরে আপনি দুটি সেটের জন্য হ্যাশকোডকে ত্বরণ হিসাবে তুলনা করতে পারেন।
আপনি কীভাবে এর মতো হ্যাশকোড বাস্তবায়ন করতে পারেন? ওয়েল যদি সেট হ্যাশকোড হয়:
- একটি শূন্য সেট জন্য শূন্য, এবং
- খালি খালি সেটটির জন্য সমস্ত উপাদানগুলির হ্যাশকোডগুলির এক্সওআর,
তারপরে আপনি যখনই কোনও উপাদান যুক্ত বা সরিয়েছেন তখনই আপনি সস্তাভাবে সেটটির ক্যাশেড হ্যাশকোডটি আপডেট করতে পারবেন। উভয় ক্ষেত্রেই আপনি কেবলমাত্র বর্তমান সেট হ্যাশকোড দিয়ে উপাদানটির হ্যাশকোডটি XOR করেন।
অবশ্যই, এটি ধরে নিয়েছে যে উপাদানগুলি হ্যাশকোডগুলি স্থিতিশীল রয়েছে যখন উপাদানগুলি সেটের সদস্য। এটি ধরেও নিয়েছে যে উপাদানগুলির ক্লাসগুলি হ্যাশকোড ফাংশনটি একটি ভাল স্প্রেড দেয়। কারণ দুটি সেট হ্যাশকোডগুলি একই হ'ল আপনাকে তখনও O(N)
সমস্ত উপাদানগুলির তুলনায় ফিরে যেতে হবে।
আপনি এই ধারণাটি আরও খানিকটা এগিয়ে নিতে পারেন ... কমপক্ষে তত্ত্বে।
সতর্কতা - এটি অত্যন্ত অনুমানমূলক। আপনি যদি চান একটি "চিন্তার পরীক্ষা"।
মনে করুন যে আপনার সেট উপাদান শ্রেণীর উপাদানটির জন্য ক্রিপ্টো চেকসামগুলি ফেরত দেওয়ার একটি পদ্ধতি রয়েছে। উপাদানগুলির জন্য ফিরে আসা চেকসামগুলি জোরিংয়ের মাধ্যমে এখন সেটটির চেকসামগুলি বাস্তবায়ন করুন।
এটি আমাদের কী কিনে?
ওয়েল, যদি আমরা ধরে নিই কিছুই প্রচ্ছন্ন হচ্ছে, সম্ভাব্যতা যে কোন দুটি অসম সেট উপাদান একই এন-বিট চেকসাম আছে 2 -n । আর সম্ভাব্যতা 2 অসম সেট একই এন-বিট চেকসাম এছাড়াও 2 আছে -n । সুতরাং আমার ধারণাটি আপনি এই 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 )।
খারাপ দিকটি হ'ল উপাদানগুলির জন্য ক্রিপ্টো চেকসামগুলি গণনা করা খুব ব্যয়বহুল, বিশেষত বিটের সংখ্যা বৃদ্ধি পাওয়ার কারণে। সুতরাং চেকসামগুলি স্মরণে রাখার জন্য আপনার সত্যিকারের কার্যকর ব্যবস্থা দরকার। এবং এটি সমস্যাযুক্ত হতে পারে।
এবং অন্যান্য খারাপ দিকটি হ'ল ত্রুটির কোনও শূন্যের সম্ভাবনা অগ্রহণযোগ্য হতে পারে , সম্ভাবনা যত কমই হোক না কেন। (তবে যদি তা হয় ... তবে মহাজাগতিক রশ্মি একটি সমালোচনামূলক কিছুকে উল্টিয়ে দেয় এমন ক্ষেত্রে আপনি কীভাবে মোকাবেলা করবেন? বা যদি এটি একই সাথে একই বিটটিকে একটি অপ্রয়োজনীয় সিস্টেমের দু'বারে উল্টায়?)