বালতিগুলি যদি খুব বেশি পূর্ণ হয় তবে আমাদের অবশ্যই এটি দেখতে হবে
একটি খুব দীর্ঘ সংযুক্ত তালিকা।
এবং যে বিন্দু পরাস্ত ধরনের।
সুতরাং এখানে একটি উদাহরণ যেখানে আমার চারটি বালতি রয়েছে।
আমার হ্যাশসেটে এখন পর্যন্ত আমার হাতী এবং ব্যাজার রয়েছে।
এটি বেশ সুন্দর পরিস্থিতি, তাই না?
প্রতিটি উপাদান শূন্য বা একটি উপাদান রয়েছে।
এখন আমরা আমাদের হ্যাশসেটে আরও দুটি উপাদান রেখেছি।
buckets elements
------- -------
0 elephant
1 otter
2 badger
3 cat
এটিও খুব খারাপ নয়।
প্রতিটি বালতিতে কেবল একটি উপাদান থাকে। সুতরাং যদি আমি জানতে চাই, এটিতে কী পান্ডা রয়েছে?
আমি খুব দ্রুত 1 নম্বর বালতি দেখতে পারি এবং এটি হয় না
সেখানে এবং
আমি জানি এটি আমাদের সংগ্রহে নেই।
যদি আমি জানতে চাই যে এটিতে বিড়াল রয়েছে কিনা, আমি বালতির দিকে তাকাই
3 নং,
আমি বিড়ালটি পাই, আমি খুব তাড়াতাড়ি জানতে পারি যে এটি আমাদের মধ্যে রয়েছে কিনা
সংগ্রহ।
আমি যদি কোয়ালা যোগ করি তবে ভাল যে এত খারাপ কিছু নয়।
buckets elements
------- -------
0 elephant
1 otter -> koala
2 badger
3 cat
সম্ভবত এখন বালতি 1 নম্বর পরিবর্তে কেবল তাকিয়ে আছে
একটি উপাদান,
আমার দু'জনের দিকে নজর দেওয়া দরকার।
তবে কমপক্ষে আমাকে হাতির, ব্যাজার এবং দেখতে হবে না
বিড়াল।
আমি যদি আবার পান্ডার সন্ধান করছি তবে এটি কেবল বালতিতে থাকতে পারে
নম্বর 1 এবং
আমাকে আর কিছু দেখার দরকার নেই তারপর ওটার এবং
কোয়ালা।
তবে এখন আমি বালতি নম্বর 1 এ এলিগেটর রেখেছি এবং আপনি পারেন
সম্ভবত এটি কোথায় যাচ্ছে দেখুন।
এটি যদি 1 নম্বর বালতিটি আরও বড়ো হতে থাকে এবং
বড়, তারপরে আমি মূলত সমস্তটি দেখতে পাচ্ছি
যারা উপাদান খুঁজে পেতে
বালতি নম্বর 1 থাকা উচিত এমন কিছু।
buckets elements
------- -------
0 elephant
1 otter -> koala ->alligator
2 badger
3 cat
যদি আমি অন্য বালতিতে স্ট্রিং যুক্ত করতে শুরু করি,
ঠিক আছে, সমস্যাটি প্রতিটি ক্ষেত্রেই আরও বড় এবং বড় হয়
একক বালতি
কীভাবে আমরা আমাদের বালতিগুলি খুব বেশি পূর্ণ হতে বাধা দেব?
সমাধান এখানে
"the HashSet can automatically
resize the number of buckets."
হ্যাশসেটটি বুঝতে পারে যে বালতিগুলি পাচ্ছে
খুব পূর্ণ.
এটির জন্য এক এক অনুসন্ধানের এই সমস্ত সুবিধাটি হারাচ্ছে
উপাদান।
এবং এটি কেবল আরও বালতি তৈরি করবে (সাধারণত আগের তুলনায় দ্বিগুণ) এবং
তারপরে উপাদানগুলিকে সঠিক বালতিতে রাখুন।
সুতরাং এখানে পৃথক সাথে আমাদের বেসিক হ্যাশসেট বাস্তবায়ন
chaining। এখন আমি একটি "স্ব-আকার পরিবর্তনকারী হ্যাশসেট" তৈরি করতে যাচ্ছি।
এই হ্যাশসেটটি বুঝতে পারে যে বালতিগুলি
খুব পূর্ণ হয়ে উঠছে এবং
এটি আরও বালতি প্রয়োজন।
লোডফ্যাক্টর আমাদের হ্যাশসেট ক্লাসের আরেকটি ক্ষেত্র।
লোডফ্যাক্টর প্রতি উপাদানগুলির গড় সংখ্যার প্রতিনিধিত্ব করে
বালতি,
যার উপরে আমরা আকার পরিবর্তন করতে চাই।
লোড ফ্যাক্টর স্থান এবং সময়ের মধ্যে একটি ভারসাম্য।
যদি বালতিগুলি খুব বেশি পূর্ণ হয় তবে আমরা আকার পরিবর্তন করব।
অবশ্যই সময় লাগে, কিন্তু
যদি বালতিগুলি হয় তবে এটি রাস্তায় আমাদের সময় বাঁচাতে পারে
আরেকটু ফাঁকা
আসুন একটি উদাহরণ দেখুন।
এখানে একটি হ্যাশসেট রয়েছে, আমরা এ পর্যন্ত চারটি উপাদান যুক্ত করেছি।
হাতি, কুকুর, বিড়াল এবং মাছ।
buckets elements
------- -------
0
1 elephant
2 cat ->dog
3 fish
4
5
এই মুহুর্তে, আমি সিদ্ধান্ত নিয়েছি যে লোডফ্যাক্টর,
সীমা,
আমি ঠিক আছি বালতি প্রতি উপাদানগুলির গড় সংখ্যা
সহ, 0.75 হয়।
বালতির সংখ্যাটি বালতিসৌধের দৈর্ঘ্য, যা 6 এবং
এই মুহুর্তে আমাদের হ্যাশসেটের চারটি উপাদান রয়েছে, তাই
বর্তমান আকার 4।
আমরা আমাদের হ্যাশসেটটির আকার পরিবর্তন করব, এটি হ'ল আমরা আরও বালতি যুক্ত করব,
যখন প্রতি বালতিতে উপাদানগুলির গড় সংখ্যা ছাড়িয়ে যায়
লোডফ্যাক্টর
এটি যখন বর্তমান আকারটি বালতি দ্বারা ভাগ করা হয় ngth দৈর্ঘ্য
লোডফ্যাক্টরের চেয়ে বড়।
এই মুহুর্তে, প্রতি বালতিতে উপাদানগুলির গড় সংখ্যা
4 দ্বারা 6 বিভক্ত।
4 টি উপাদান, 6 বালতি, এটি 0.67।
এটি আমি যে থ্রেশহোল্ডটি 0.75 সেট করেছি তার চেয়ে কম তাই আমরা আছি
ঠিক আছে.
আমাদের পুনরায় আকার দেওয়ার দরকার নেই।
তবে এখন ধরা যাক আমরা উডচাক যুক্ত করি।
buckets elements
------- -------
0
1 elephant
2 woodchuck-> cat ->dog
3 fish
4
5
উডচাক শেষ হবে 3 নম্বর বালতিতে।
এই মুহুর্তে, বর্তমানের আকারটি 5 হয়।
এবং এখন প্রতি বালতিতে উপাদানগুলির গড় সংখ্যা
bucket.length দ্বারা বিভক্ত বর্তমান আকার।
এটি 5 টি উপাদান 6 টি বালতি দ্বারা বিভক্ত 0.83।
এবং এটি লোড ফ্যাক্টর ছাড়িয়েছে যা 0.75 ছিল।
এই সমস্যাটির সমাধান করার জন্য, এটি তৈরি করার জন্য
বালতি সম্ভবত একটু
আরও খালি যাতে ক্রিয়াকলাপগুলি নির্ধারণ করার মতো যা
বালতি থাকে
একটি উপাদান একটু কম জটিল হবে, আমি পুনরায় আকার দিতে চাই
আমার হ্যাশসেট
হ্যাশসেটকে পুনরায় আকার দেওয়া দুটি পদক্ষেপ নেয়।
প্রথমে আমি বালতি সংখ্যা দ্বিগুণ করব, আমার কাছে 6 টি বালতি ছিল,
এখন আমি 12 বালতি আনতে যাচ্ছি।
এখানে নোট করুন যে লোড ফ্যাক্টরটি আমি 0.75 এ সেট করেছিলাম একই থাকে।
তবে পরিবর্তিত বালতির সংখ্যা 12,
উপাদানগুলির সংখ্যা একই ছিল, 5।
5 দ্বারা 12 দ্বারা বিভক্ত প্রায় 0.42 এর কাছাকাছি, এটি আমাদের অধীনে রয়েছে
loadFactor,
সুতরাং আমরা এখন ঠিক আছে।
কিন্তু আমরা কিছু করিনি কারণ এর মধ্যে কয়েকটি উপাদান রয়েছে
ভুল বালতি এখন।
উদাহরণস্বরূপ, হাতি।
হাতি সংখ্যা 2 বলে বালতি ছিল
হাতির চরিত্রগুলি
8 ছিল।
আমাদের 6 টি বালতি রয়েছে, 8 বিয়োগ 6 টি 2।
সে কারণেই এটি 2 নম্বরে শেষ হয়েছে।
তবে এখন আমাদের কাছে 12 টি বালতি রয়েছে, 8 টি 12 টি 8, তাই
হাতির আর 2 নম্বর বালতিতে নেই।
হাতি 8 নম্বর বালতিতে অন্তর্ভুক্ত।
উডচাক কী?
উডচাকই এই সমস্যাটি শুরু করেছিলেন।
উডচাক শেষ হয়েছে 3 নম্বর বালতিতে।
9 মড 6 কারণ 3।
তবে এখন আমরা 9 মোড 12 করি।
9 মোড 12 9 হয়, কাঠচাক 9 নম্বর বালতিতে যায়।
এবং আপনি এই সমস্ত সুবিধা দেখুন।
3 নম্বর বালতিতে কেবল দুটি উপাদান রয়েছে যেখানে এর আগে 3 ছিল 3
সুতরাং এখানে আমাদের কোড,
যেখানে আমাদের পৃথক শৃঙ্খলা সহ আমাদের হ্যাশসেট ছিল
কোন আকার পরিবর্তন করেনি।
এখন, এখানে একটি নতুন বাস্তবায়ন রয়েছে যেখানে আমরা পুনরায় আকার ব্যবহার করি।
এই কোডটির বেশিরভাগটি একই,
আমরা এখনও এটি নির্ধারণ করতে যাচ্ছি এটিতে এটি রয়েছে কিনা
ইতিমধ্যে মান।
যদি এটি না হয়, তবে এটি কী বালতিটি তা আমরা খুঁজে বের করব
প্রবেশ করা উচিত এবং
তারপরে এটিকে সেই বালতিতে যুক্ত করুন, এটি সেই লিঙ্কডলিস্টে যুক্ত করুন।
তবে এখন আমরা বর্তমানের আকারটি বাড়িয়ে দিই।
কারেন্টসাইজটি এমন ক্ষেত্র ছিল যা সংখ্যার উপর নজর রাখে
আমাদের হ্যাশসেটের উপাদানগুলির।
আমরা এটি বৃদ্ধি করতে যাচ্ছি এবং তারপরে আমরা সন্ধান করব
গড় লোড এ,
প্রতি বালতিতে উপাদানগুলির গড় সংখ্যা।
আমরা এখানে এই বিভাগটি করব।
নিশ্চিত করতে আমাদের এখানে কিছুটা কাস্টিং করতে হবে
যে আমরা একটি ডাবল পেতে।
এবং তারপরে, আমরা ক্ষেত্রের সাথে গড় গড় বোঝা তুলনা করব
যে আমি হিসাবে সেট করেছি
0.75 আমি যখন এই হ্যাশসেটটি তৈরি করেছি, উদাহরণস্বরূপ, যা ছিল
লোডফ্যাক্টর
যদি গড় লোড লোড ফ্যাক্টরের চেয়ে বেশি হয়,
তার মানে প্রতি বালতিতে প্রচুর উপাদান রয়েছে
গড়, এবং আমার আবার সন্নিবেশ করা প্রয়োজন।
তাই পুনরায় সন্নিবেশ করার পদ্ধতিটি এখানে আমাদের বাস্তবায়ন
সমস্ত উপাদান।
প্রথমে আমি ওল্ডবকেটস নামে একটি স্থানীয় ভেরিয়েবল তৈরি করব।
বালতিগুলি বর্তমানে দাঁড়িয়ে থাকায় যা উল্লেখ করছে
আমি সব কিছু পুনরায় আকার দেওয়া শুরু করার আগে।
দ্রষ্টব্য আমি এখনও লিঙ্কযুক্ত তালিকার একটি নতুন অ্যারে তৈরি করছি না।
আমি কেবল বালতিদের পুরানো বালতি হিসাবে নামকরণ করছি।
এখন মনে রেখো বালতিগুলি আমাদের ক্লাসের একটি ক্ষেত্র ছিল, আমি যাচ্ছি
এখন একটি নতুন অ্যারে তৈরি করতে
লিঙ্কযুক্ত তালিকার তবে এটিতে দ্বিগুণ উপাদান থাকবে elements
এটি প্রথমবার হিসাবে।
এখন আমার আসলে পুনরায় লাগানো দরকার,
আমি পুরানো বালতি সমস্ত মাধ্যমে পুনরাবৃত্তি করতে যাচ্ছি।
পুরানোবকেটের প্রতিটি উপাদান স্ট্রিংগুলির একটি লিঙ্কযুক্ত তালিকা L
এটি একটি বালতি
আমি সেই বালতি দিয়ে যাব এবং এতে প্রতিটি উপাদান পাব
বালতি।
এবং এখন আমি এটি নতুন বালকে পুনরায় .োকাতে চাই।
আমি এর হ্যাশকোড পাব।
এটি কোন সূচকটি তা নির্ধারণ করব।
এবং এখন আমি নতুন বালতি, নতুন লিঙ্কডলিস্ট পেয়েছি ist
স্ট্রিং এবং
আমি এটি নতুন বালতিতে যুক্ত করব।
সুতরাং পুনরুদ্ধার করার জন্য, হ্যাশসেটগুলি আমরা দেখেছি লিঙ্কযুক্ত অ্যারেগুলি
তালিকা বা বালতি।
একটি স্ব-আকার পরিবর্তনকারী হ্যাশসেট কিছু অনুপাত বা ব্যবহার করে বুঝতে পারে
capacity = N/0.75
পুনঃস্থাপন এড়াতে সুনির্দিষ্ট পরামর্শ দিচ্ছে, তবে আমার প্রাথমিক চিন্তাটি সবেমাত্র স্থির ছিলload factor = 1
। এই পন্থাটি কি ডাউনসাইডস হবে? কেন লোড ফ্যাক্টর প্রভাবিত করবেget()
এবংput()
অপারেশন ব্যয় করবে?