হ্যাশম্যাপে লোড ফ্যাক্টরের তাৎপর্য কী?


232

HashMapদুটি গুরুত্বপূর্ণ বৈশিষ্ট্য রয়েছে: sizeএবং load factor। আমি জাভা ডকুমেন্টেশন দিয়েছিলাম এবং এটি 0.75fপ্রাথমিক লোড ফ্যাক্টর বলে। তবে আমি এর আসল ব্যবহার খুঁজে পাচ্ছি না।

আমাদের বোঝার ফ্যাক্টর সেট করার জন্য বিভিন্ন পরিস্থিতিতে কী কী বর্ণনা করা যেতে পারে এবং বিভিন্ন ক্ষেত্রে কিছু নমুনার আদর্শ মানগুলি কী কী তা বর্ণনা করতে পারে?

উত্তর:


266

ডকুমেন্টেশন এটা প্রশংসনীয় ভাল ব্যাখ্যা করে:

হাশম্যাপের একটি উদাহরণে দুটি পরামিতি রয়েছে যা এর কার্য সম্পাদনকে প্রভাবিত করে: প্রাথমিক ক্ষমতা এবং লোড ফ্যাক্টর। ক্ষমতা হ্যাশ টেবিলের বালতি সংখ্যা, এবং প্রাথমিক ক্ষমতা কেবল হ্যাশ টেবিল তৈরি করার সময় ক্ষমতা হয়। লোড ফ্যাক্টর হ্যাশ টেবিলটির ক্ষমতা স্বয়ংক্রিয়ভাবে বৃদ্ধির আগে কতটা পূর্ণ তা মঞ্জুর করার একটি পরিমাপ। যখন হ্যাশ টেবিলের এন্ট্রিগুলির সংখ্যা লোড ফ্যাক্টরের পণ্য এবং বর্তমান ক্ষমতা ছাড়িয়ে যায়, হ্যাশ টেবিলটি পুনরায় করা হয় (যা অভ্যন্তরীণ ডেটা স্ট্রাকচারগুলি পুনর্নির্মাণ করা হয়) যাতে হ্যাশ টেবিলটি বালতির সংখ্যার চেয়ে দ্বিগুণ হয়ে থাকে।

একটি সাধারণ নিয়ম হিসাবে, ডিফল্ট লোড ফ্যাক্টর (.75) সময় এবং স্থান ব্যয়ের মধ্যে একটি ভাল ট্রেড অফ দেয়। উচ্চ মানগুলি স্পেস ওভারহেড হ্রাস করে তবে অনুসন্ধানের ব্যয় বাড়ায় (গ্যাড অ্যান্ড পুট সহ হ্যাশম্যাপ ক্লাসের বেশিরভাগ ক্রিয়াকলাপে প্রতিফলিত হয়)। প্রাথমিক ক্ষমতা নির্ধারণের সময় মানচিত্রে এবং এর লোড ফ্যাক্টরের প্রত্যাশিত সংখ্যার বিষয়টি বিবেচনায় নেওয়া উচিত, যাতে পুনঃস্থাপনের ক্রিয়াকলাপের সংখ্যা হ্রাস করা যায়। যদি প্রাথমিক ক্ষমতা লোড ফ্যাক্টর দ্বারা বিভক্ত সর্বাধিক সংখ্যক এন্ট্রিগুলির চেয়ে বেশি হয়, তবে কোনও পুনঃস্থাপন ক্রিয়াকলাপ ঘটবে না।

সমস্ত পারফরম্যান্স অপটিমাইজেশনের মতো, অকালকে আগে জিনিসগুলি অপ্টিমাইজ করা এড়ানো ভাল ধারণা (যেমন বাধা কোথায় আছে তার হার্ড ডেটা ছাড়াই)।


14
অন্যান্য উত্তরগুলি capacity = N/0.75পুনঃস্থাপন এড়াতে সুনির্দিষ্ট পরামর্শ দিচ্ছে, তবে আমার প্রাথমিক চিন্তাটি সবেমাত্র স্থির ছিল load factor = 1। এই পন্থাটি কি ডাউনসাইডস হবে? কেন লোড ফ্যাক্টর প্রভাবিত করবে get()এবং put()অপারেশন ব্যয় করবে?
সুপারমিচ

19
সংখ্যার এন্ট্রি = ক্ষমতা সহ একটি লোড ফ্যাক্টর = 1 হ্যাশম্যাপের পরিসংখ্যানগতভাবে উল্লেখযোগ্য পরিমাণ সংঘর্ষ হবে (= যখন একাধিক কী একই হ্যাশ তৈরি করছে)। যখন সংঘর্ষ ঘটে তখন দেখার সময় বাড়ে, যেমন একটি বালতিতে>> 1 টি মিলবে এমন এন্ট্রি থাকবে, যার জন্য সাম্যের জন্য কীটি পৃথকভাবে পরীক্ষা করা উচিত। কিছু বিশদ গণিত: preshing.com/20110504/hash-collision- প্রবণতা
20

8
আমি আপনাকে @atimb অনুসরণ করছি না; লোডসেট বৈশিষ্ট্যটি কেবলমাত্র স্টোরেজ আকারটি কখন বাড়ানো যায় তা নির্ধারণ করতে ব্যবহৃত হয়? - একজনের লোডসেটটি কীভাবে হ্যাশের সংঘর্ষের সম্ভাবনা বাড়িয়ে তুলবে? - হ্যাশিং অ্যালগরিদমের মানচিত্রে কয়টি আইটেম রয়েছে বা এটি প্রায়শই নতুন স্টোরেজ "বালতি" ইত্যাদি কীভাবে অর্জন করে সে সম্পর্কে কোনও জ্ঞান নেই etc. একই আকারের কোনও সামগ্রীর জন্য সেগুলি কীভাবে সংরক্ষণ করা হয় তা নির্বিশেষে আপনার কাছে থাকা উচিত বারবার হ্যাশ মানের একই সম্ভাবনা ...
BrainSlugs83

19
মানচিত্রের আকার বড় হলে হ্যাশের সংঘর্ষের সম্ভাবনা কম is উদাহরণস্বরূপ হ্যাশ কোড 4, 8, 16 এবং 32 সহ উপাদানগুলি একই বালতিতে স্থাপন করা হবে, যদি মানচিত্রের আকার 4 হয় তবে মানচিত্রের আকার 32 এর বেশি হলে প্রতিটি আইটেম একটি নিজস্ব বালতি পাবে। প্রারম্ভিক আকার 4 এবং লোড ফ্যাক্টর 1.0 (4 বালতি, তবে একটি বালতিতে সমস্ত 4 উপাদান) সহ মানচিত্রটি এই উদাহরণে লোড ফ্যাক্টর 0.75 (8 বালতি, দুটি বালতি ভরাট - সহ অন্য একের তুলনায় গড় দুই গুণ কম হবে - উপাদান "4" এবং "8", "16", "32" উপাদান সহ)।
শে

1
উচ্চ লোডের কারণগুলির জন্য @ অ্যাডেলিন লুকআপ ব্যয় বৃদ্ধি করা হয়েছে কারণ উচ্চতর মানের জন্য আরও সংঘর্ষ হবে এবং জাভা যেভাবে সংঘর্ষগুলি পরিচালনা করে তা হ'ল হ্যাশকোডযুক্ত আইটেমগুলিকে একই কাঠামোর মধ্যে ডেটা কাঠামো ব্যবহার করে রাখার মাধ্যমে। জাভা 8-এ শুরু করে, এই ডেটা স্ট্রাকচারটি বাইনারি অনুসন্ধান গাছ। যুক্তগুলির সমস্ত উপাদান একই হ্যাশকোডের সাথে সংঘটিত হওয়ার সাথে সাথে অনুসন্ধানটিকে সবচেয়ে খারাপ ক্ষেত্রে জটিলতা O (lg (n)) তৈরি করে worst
জিগি বাইতে 2

141

HashMapগ্রহণের ডিফল্ট প্রাথমিক ক্ষমতা 16 এবং লোড ফ্যাক্টর 0.75f ​​(বর্তমান মানচিত্রের আকারের 75%)। লোড ফ্যাক্টরটি কী স্তরে HashMapক্ষমতা দ্বিগুণ করা উচিত তা উপস্থাপন করে ।

যেমন ক্ষমতা এবং লোড ফ্যাক্টরের পণ্য 16 * 0.75 = 12। এটি প্রতিনিধিত্ব করে যে দ্বাদশ কী - মান জোড়াটি স্টোর করার পরে HashMap, এর ক্ষমতা 32 হয়ে যায়।


3
যদিও আপনার উত্তরটি পরিষ্কার, আপনি দয়া করে বলতে পারবেন 12 কী-মূল্যের জুড়ি সংরক্ষণের পরে ক্ষমতাটি 32 হয়ে যায় বা এটি যখন 13 তম এন্ট্রি যুক্ত হয়, তখন ক্ষমতাটি পরিবর্তন হয় এবং তারপরে প্রবেশ প্রবেশ করানো হয়।
userab

তার মানে কি বালতির সংখ্যা 2 দ্বারা বৃদ্ধি পেয়েছে?
লাভমাউ

39

আসলে, আমার গণনা থেকে, "নিখুঁত" লোড ফ্যাক্টর লগ 2 (~ 0.7) এর কাছাকাছি। যদিও এর চেয়ে কম লোড ফ্যাক্টর আরও ভাল পারফরম্যান্স দেবে। আমি মনে করি .75 সম্ভবত একটি টুপি থেকে টানা ছিল।

প্রমাণ:

চেইন এড়ানো যায় এবং বালতি ফাঁকা থাকে কি না তা অনুমান করে শাখার ভবিষ্যদ্বাণী শোষণ করা যায়। কোনও বালতি সম্ভবত খালি থাকলে এর খালি থাকার সম্ভাবনাটি 5 ছাড়িয়ে যায়।

এর আকার এবং n যুক্ত করা কীগুলির সংখ্যা উপস্থাপন করুন। দ্বিপদী উপপাদ ব্যবহার করে, বালতি খালি হওয়ার সম্ভাবনাটি হ'ল:

P(0) = C(n, 0) * (1/s)^0 * (1 - 1/s)^(n - 0)

সুতরাং, একটি বালতি কম খালি থাকলে সম্ভবত খালি

log(2)/log(s/(s - 1)) keys

S যেমন অসীমতায় পৌঁছেছে এবং যুক্ত কীগুলির সংখ্যাটি যদি পি (0) = .5 এর মতো হয় তবে n / s লগ (2) এ দ্রুত পৌঁছে যায়:

lim (log(2)/log(s/(s - 1)))/s as s -> infinity = log(2) ~ 0.693...

4
ম্যাথ নার্ডস এফটিডাব্লু! সম্ভবত .75ভগ্নাংশটি বোঝার জন্য নিকটতম সহজতে গোল করা হয়েছিল log(2)এবং ম্যাজিক সংখ্যার চেয়ে কম দেখাচ্ছে। আমি জেডিকে ডিফল্ট মানটির আপডেট দেখতে পছন্দ করব, এর বাস্তবায়নের উপরে মন্তব্য সহ: ডি
ডিকোডেড

2
আমি সত্যিই এই উত্তর মত করতে চান, কিন্তু আমি JavaEE ডেভেলপার, যার মানে গণিত আমার শক্তিশালী মামলা ছিল না সত্যিই আছি, তাই আমি কি আপনি লিখেছেন তোমার খুব সামান্য বুঝতে
searchengine27

28

লোড ফ্যাক্টর কী?

ক্ষমতার পরিমাণ বাড়ানোর জন্য হ্যাশম্যাপের জন্য কতটুকু অবসন্ন হতে হবে?

লোড ফ্যাক্টর কেন?

লোড ফ্যাক্টরটি প্রাথমিক ক্ষমতার ডিফল্ট ০.75৫ (১ 16) সুতরাং সক্ষমতা বৃদ্ধি হওয়ার আগেই বালতিগুলির ২৫% ফ্রি হবে এবং এটি নতুন হ্যাশকোড সহ অনেকগুলি নতুন বালতি তৈরি করেছে যা কেবলমাত্র বৃদ্ধির পরেই তাদের উপস্থিতি দেখিয়েছে বালতি সংখ্যা।

এখন কেন আপনার অনেকগুলি বিনামূল্যে বালতি রাখা উচিত এবং পারফরম্যান্সে ফ্রি বালতি রাখার প্রভাব কী?

আপনি যদি লোডিং ফ্যাক্টরটি 1.0 বলে সেট করেন তবে খুব আকর্ষণীয় কিছু ঘটতে পারে।

বলুন যে আপনি আপনার হ্যাশম্যাপে একটি অবজেক্ট এক্স যুক্ত করছেন যার হ্যাশকোড ৮৮৮ এবং আপনার হ্যাশম্যাপে হ্যাশকোডের প্রতিনিধিত্বকারী বালতিটি বিনামূল্যে, তাই অবজেক্ট এক্স বালতিতে যুক্ত হয়েছে, তবে এখন আবার বলুন আপনি যদি অন্য কোনও বস্তু যুক্ত করছেন যা হ্যাশকোড এছাড়াও ৮৮৮ এর পরে আপনার অবজেক্ট y বালতিটির শেষে BUT- এর জন্য যুক্ত হয়ে যাবে ( কারণ বালতিগুলি লিঙ্কযুক্ত তালিকা ছাড়াও কিছুই নয়, সংরক্ষণের কী, মান এবং পরবর্তী ) এখন এটির কার্যকারিতা প্রভাব ফেলে! যেহেতু আপনার অবজেক্ট y এখন বালতির মাথায় উপস্থিত নেই আপনি যদি একটি অনুসন্ধান সম্পাদন করেন তবে যে সময় নেওয়া হবে তা হে হবে না (1)এবার একই বালতিতে কত আইটেম রয়েছে তার উপর নির্ভর করে। একে পথে হ্যাশ সংঘর্ষ বলা হয় এবং এটি তখনও ঘটে যখন আপনার লোডিং ফ্যাক্টর 1 এর কম হয়।

পারফরম্যান্স, হ্যাশ সংঘর্ষ এবং লোডিং ফ্যাক্টরের মধ্যে সম্পর্ক?

লোয়ার লোড ফ্যাক্টর = আরও বিনামূল্যে বালতি = সংঘর্ষের কম সম্ভাবনা = উচ্চ কার্যকারিতা = উচ্চ স্থানের প্রয়োজনীয়তা।

আমি কোথাও ভুল হলে আমাকে সংশোধন করুন।


2
আপনি কীভাবে হ্যাশকোডকে 1- {কাউন্ট বালতি of এর পরিসীমা সহ একটি সংখ্যায় নামিয়ে দেওয়া হয় সে সম্পর্কে কিছুটা যোগ করতে পারেন, এবং তাই এটি বালতিগুলির সংখ্যা অনুসারে নয়, তবে হ্যাশ অ্যালগরিদমের সেই শেষ ফলাফলটি কভার করে বৃহত্তর পরিসীমা। হ্যাশকোড পূর্ণ হ্যাশ অ্যালগরিদম নয়, এটি সহজেই পুনরায় প্রক্রিয়াজাতকরণের জন্য যথেষ্ট ছোট। সুতরাং "ফ্রি বালতি" এর কোনও ধারণা নেই, তবে "ন্যূনতম ফ্রি বালতিগুলির সংখ্যা", যেহেতু আপনি একই বালতিতে আপনার সমস্ত উপাদান সংরক্ষণ করতে পারেন। বরং এটি আপনার হ্যাশকোডের মূল-স্থান, যা সামর্থ্য * (1 / লোড_ফ্যাক্টর) এর সমান। 40 টি উপাদান, 0.25 লোড ফ্যাক্টর = 160 বালতি।
ব্যবহারকারী1122069

আমি মনে করি যে কোনও বস্তুর জন্য অনুসন্ধানের সময়টিকে LinkedListউল্লেখ করা হয়েছে Amortized Constant Execution Timeএবং হিসাবে চিহ্নিত +করা হয়েছেO(1)+
রাফ

19

ডকুমেন্টেশন থেকে :

লোড ফ্যাক্টর হ্যাশ টেবিলটির ক্ষমতা স্বয়ংক্রিয়ভাবে বৃদ্ধির আগে কতটা পূর্ণ তা মঞ্জুর করার একটি পরিমাপ

এটি সত্যই আপনার নির্দিষ্ট প্রয়োজনীয়তার উপর নির্ভর করে, প্রাথমিক লোড ফ্যাক্টর নির্দিষ্ট করার জন্য কোনও "থাম্বের নিয়ম" নেই।


ডকুমেন্টেশন আরও বলে; "একটি সাধারণ নিয়ম হিসাবে, ডিফল্ট লোড ফ্যাক্টর (.75) সময় এবং স্থানের ব্যয়ের মধ্যে একটি ভাল ট্রেড অফ দেয়" " সুতরাং যে কেউ অনিশ্চিত, তাদের ডিফল্ট হ'ল থাম্বের একটি ভাল নিয়ম।
ফেরেকডলি

4

হ্যাশম্যাপ DEFAULT_INITIAL_CAPACITY = 16 এবং ডিএফএএলএফএলএডিএডিএফএসিএকিটি = 0.75 এর অর্থ হ্যাশম্যাপ = 16 * 0.75 = 12 এ সমস্ত এন্ট্রির ম্যাক্স সংখ্যা । যখন ত্রয়োদশ উপাদান যুক্ত হবে তখন হ্যাশম্যাপের ক্ষমতা (অ্যারে আকার) দ্বিগুণ হবে! নিখুঁত চিত্রণ এই প্রশ্নের উত্তর দিয়েছে: এখানে চিত্র বর্ণনা লিখুন চিত্রটি এখান থেকে নেওয়া হয়েছে:

https://javabypatel.blogspot.com/2015/10/what-is-load-factor-and-rehashing-in-hashmap.html


2

বালতিগুলি যদি খুব বেশি পূর্ণ হয় তবে আমাদের অবশ্যই এটি দেখতে হবে

একটি খুব দীর্ঘ সংযুক্ত তালিকা।

এবং যে বিন্দু পরাস্ত ধরনের।

সুতরাং এখানে একটি উদাহরণ যেখানে আমার চারটি বালতি রয়েছে।

আমার হ্যাশসেটে এখন পর্যন্ত আমার হাতী এবং ব্যাজার রয়েছে।

এটি বেশ সুন্দর পরিস্থিতি, তাই না?

প্রতিটি উপাদান শূন্য বা একটি উপাদান রয়েছে।

এখন আমরা আমাদের হ্যাশসেটে আরও দুটি উপাদান রেখেছি।

     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

স্ট্রিং এবং

আমি এটি নতুন বালতিতে যুক্ত করব।

সুতরাং পুনরুদ্ধার করার জন্য, হ্যাশসেটগুলি আমরা দেখেছি লিঙ্কযুক্ত অ্যারেগুলি

তালিকা বা বালতি।

একটি স্ব-আকার পরিবর্তনকারী হ্যাশসেট কিছু অনুপাত বা ব্যবহার করে বুঝতে পারে


1

আমি n * 1.5 বা n + (n >> 1) এর একটি টেবিলের আকারটি বেছে নেব, এটি বিভাজন ছাড়াই .66666 a এর লোড ফ্যাক্টর দেবে, যা বেশিরভাগ সিস্টেমে ধীরে ধীরে, বিশেষত বহনযোগ্য সিস্টেমগুলিতে যেখানে কোনও বিভাজন নেই on হার্ডওয়্যার

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.