সেবাস্তিয়ানের উত্তরটি সঠিক, তবে কেন এটি নিরাপদ তা আমি জানতে চেয়েছিলাম , তাই আমি মানচিত্রের উত্স কোডটিতে কিছু খনন করেছি । এটি কল করার মতো মনে হচ্ছে delete(k, v)
, এটি মূলত কেবল মূল্য মুছার পরিবর্তে একটি পতাকা সেট করে (পাশাপাশি গণনা মান পরিবর্তন করে):
b->tophash[i] = Empty;
(খালি মূল্য একটি ধ্রুবক 0
)
মানচিত্রটি যা করছে বলে মনে হচ্ছে তা মানচিত্রের আকারের উপর নির্ভর করে একটি সেট সংখ্যক বালতি বরাদ্দ করা হচ্ছে, যা আপনি 2^B
( এই উত্স কোড থেকে ) হারে সন্নিবেশ সম্পাদন করার সাথে সাথে বাড়বে :
byte *buckets; // array of 2^B Buckets. may be nil if count==0.
সুতরাং আপনার ব্যবহারের চেয়ে প্রায় সবসময় বেশি বালতি বরাদ্দ রয়েছে এবং আপনি যখন range
মানচিত্রের উপরে একটি কাজ করেন, এটি tophash
প্রতিটি বালতিটির সেই মানটি পরীক্ষা করে এটি পরীক্ষা করতে 2^B
পারে কিনা তা পরীক্ষা করে।
সংক্ষিপ্তসার হিসাবে, একটি এর delete
অভ্যন্তরীণটি range
নিরাপদ কারণ তথ্য প্রযুক্তিগতভাবে এখনও রয়েছে, তবে এটি যখন পরীক্ষা করে তখন tophash
এটি দেখতে পাবে যে এটি কেবল এটি এড়িয়ে যেতে পারে এবং range
আপনি যে কোনও ক্রিয়াকলাপ সম্পাদন করছেন তা এতে অন্তর্ভুক্ত করতে পারে না । উত্স কোড এমনকি একটি অন্তর্ভুক্ত TODO
:
// TODO: consolidate buckets if they are mostly empty
// can only consolidate if there are no live iterators at this size.
এটি ব্যাখ্যা করে যে delete(k,v)
ফাংশনটি ব্যবহার করা আসলে মেমরিটি মুক্ত করে না, কেবল আপনাকে যে বালতিতে অ্যাক্সেসের অনুমতি দেওয়া হয়েছে তার তালিকা থেকে সরিয়ে দেয়। আপনি যদি সত্যিকারের স্মৃতি মুক্ত করতে চান তবে আপনাকে পুরো মানচিত্রটি অ্যাক্সেসযোগ্য করে তুলতে হবে যাতে আবর্জনা সংগ্রহের পদক্ষেপটি শুরু হয়। আপনি একটি লাইনের সাহায্যে এটি করতে পারেন
map = nil