একটি জাভা হ্যাশম্যাপ আসলেই ও (1)?


159

আমি এসও রে জাভা হ্যাশম্যাপ এবং তাদের দেখার O(1)সময় সম্পর্কে কিছু আকর্ষণীয় দাবি দেখেছি । এমন কেউ কেন ব্যাখ্যা করতে পারে? এই হ্যাশম্যাপগুলি যে সমস্ত হ্যাশিং অ্যালগরিদম থেকে কেনা হয়েছিল তার থেকে সম্পূর্ণ আলাদা না হলে সর্বদা সংঘর্ষযুক্ত একটি ডেটাসেট থাকতে হবে।

কোন ক্ষেত্রে, চেহারা O(n)চেয়ে বরং হবে O(1)

কেউ ব্যাখ্যা করতে পারবেন কিনা তারা হয় হে (1) এবং, যদি তাই হয়, কিভাবে তারা এই অর্জন?


1
আমি জানি এটি কোনও উত্তর হতে পারে না তবে আমি মনে করি উইকিপিডিয়ায় এই সম্পর্কে একটি খুব ভাল নিবন্ধ রয়েছে। কর্মক্ষমতা বিশ্লেষণ বিভাগটি মিস করবেন না
বিজয়ী হুগো

28
বিগ হে নোটেশন আপনি যে নির্দিষ্ট ধরণের বিশ্লেষণ করছেন তার জন্য একটি উচ্চতর বাউন্ড দেয়। আপনি এখনও খারাপ পরিস্থিতি, গড় ক্ষেত্রে ইত্যাদিতে আগ্রহী কিনা তা আপনাকে উল্লেখ করতে হবে
ড্যান হোম্রিক

উত্তর:


127

হ্যাশম্যাপের একটি বিশেষ বৈশিষ্ট্য হ'ল সুষম গাছের তুলনায় এর আচরণ সম্ভাবনাযুক্ত। এই ক্ষেত্রেগুলির মধ্যে সবচেয়ে খারাপ পরিস্থিতি সংঘটিত হওয়ার সম্ভাব্যতার দিক থেকে জটিলতার বিষয়ে কথা বলতে সাধারণত সবচেয়ে সহায়ক হয়। একটি হ্যাশ মানচিত্রের জন্য, অবশ্যই মানচিত্রটি কতটা পূর্ণ হতে পারে তার সাথে সংঘর্ষের ঘটনা। একটি সংঘর্ষ অনুমান করা বেশ সহজ।

p সংঘর্ষ = n / ক্ষমতা

সুতরাং এমন একটি হ্যাশ মানচিত্র এমনকি সামান্য সংখ্যক উপাদান সহ কমপক্ষে একটি সংঘর্ষের সম্ভাবনা রয়েছে। বড় ও স্বরলিপি আমাদের আরও কিছু জোরালো করার অনুমতি দেয়। যে কোনও নির্বিচারে, স্থির ধ্রুবক কে।

ও (এন) = ও (কে * এন)

হ্যাশ মানচিত্রের কর্মক্ষমতা উন্নত করতে আমরা এই বৈশিষ্ট্যটি ব্যবহার করতে পারি। আমরা পরিবর্তে সর্বাধিক 2 টি সংঘর্ষের সম্ভাবনা সম্পর্কে ভাবতে পারি।

পি সংঘর্ষ x 2 = (এন / ক্ষমতা) 2

এটি অনেক কম। যেহেতু একটি অতিরিক্ত সংঘর্ষ হ্যান্ডল করার ব্যয়টি বিগ ও পারফরম্যান্সের সাথে অপ্রাসঙ্গিক, তাই আমরা আসলে অ্যালগরিদম পরিবর্তন না করেই পারফরম্যান্স উন্নয়নের একটি উপায় খুঁজে পেয়েছি! আমরা এটিকে জেনারেলজি করতে পারি

p সংঘর্ষ xk = (n / ক্ষমতা) কে

এবং এখন আমরা সংঘর্ষের কয়েকটি স্বেচ্ছাসেবীকে অগ্রাহ্য করতে পারি এবং আমরা যে হিসাব করছি তার চেয়ে বেশি সংঘর্ষের ঝুঁকির ক্ষুদ্র সম্ভাবনা শেষ করতে পারি। অ্যালগরিদমের আসল বাস্তবায়ন পরিবর্তন না করে আপনি সঠিক কে বেছে নেওয়ার মাধ্যমে আপনি নির্বিচারে ক্ষুদ্র স্তরে সম্ভাবনাটি পেতে পারেন।

আমরা এটি নিয়ে এই কথা বলি যে হ্যাশ-মানচিত্রে উচ্চ সম্ভাবনার সাথে ও (1) অ্যাক্সেস রয়েছে


এইচটিএমএল সহ, আমি এখনও ভগ্নাংশগুলি নিয়ে সত্যই খুশি নই। আপনি যদি এটি করার কোনও দুর্দান্ত উপায় সম্পর্কে ভাবতে পারেন তবে সেগুলি পরিষ্কার করুন।
সিঙ্গেলাইজেশন নির্মূল

4
প্রকৃতপক্ষে, উপরেরটি যা বলেছেন তা হ'ল ও (লগ এন) প্রভাবগুলি স্থির করা হয়েছে, অ-চূড়ান্ত মানগুলির জন্য, স্থির ওভারহেড দ্বারা N
হট লিক্স

প্রযুক্তিগতভাবে, আপনি যে নম্বরটি দিয়েছেন তা হ'ল সংঘর্ষের প্রত্যাশিত মান, যা কোনও একক সংঘর্ষের সম্ভাবনার সমান হতে পারে।
সাইমন কুয়াং

1
এটি কি ইমোর্টাইজড বিশ্লেষকের মতো?
lostsoul29

1
@ OleV.V। একটি হ্যাশম্যাপের ভাল পারফরম্যান্সটি সর্বদা আপনার হ্যাশ ফাংশনটির একটি ভাল বিতরণে ডিপেন্ডেন্ড থাকে। আপনি আপনার ইনপুটটিতে একটি ক্রিপ্টোগ্রাফিক হ্যাশিং ফাংশন ব্যবহার করে হ্যাশিং গতির জন্য আরও ভাল হ্যাশ মানের বাণিজ্য করতে পারেন।
সিঙ্গেলাইজেশন নির্মূল 0

38

আপনি গড়-কেস (প্রত্যাশিত) রানটাইমের সাথে সবচেয়ে খারাপ-আচরণের মিশ্রণটি দেখায়। পূর্ববর্তী হ্যাশ টেবিলগুলির জন্য সাধারণভাবে ও (এন) হ'ল সাধারণভাবে (যেমন নিখুঁত হ্যাশিং ব্যবহার না করা) তবে এটি বাস্তবে খুব কমই প্রাসঙ্গিক।

যে কোনও নির্ভরযোগ্য হ্যাশ টেবিল বাস্তবায়ন, অর্ধেক শালীন হ্যাশের সাথে মিলিয়ে, অপেক্ষার খুব সংকীর্ণ ব্যবধানের মধ্যে প্রত্যাশিত ক্ষেত্রে খুব ছোট ফ্যাক্টর (2, বাস্তবে) সহ ও (1) এর পুনরুদ্ধার কর্মক্ষমতা থাকে।


6
আমি সবসময় ভেবেছিলাম আপার বাউন্ডটি সবচেয়ে খারাপ ক্ষেত্রে তবে মনে হয় আমি ভুল হয়ে গিয়েছিলাম - আপনার গড় গড়ের জন্য উপরের আবদ্ধ থাকতে পারে। সুতরাং দেখা যাচ্ছে যে ও (1) দাবীকারী লোকেরা এটি পরিষ্কার করে দেওয়া উচিত ছিল যে গড় ক্ষেত্রে ছিল। সবচেয়ে খারাপ পরিস্থিতি এমন একটি ডেটা সেট যেখানে সেখানে অনেকগুলি সংঘর্ষ হয় যার ফলে এটি ও (এন) হয়। এখন তা বোধগম্য হয়।
paxdiablo

2
আপনার সম্ভবত এটি স্পষ্ট করে দেওয়া উচিত যে আপনি যখন গড় কেসের জন্য বড় হে সংকেত ব্যবহার করেন তখন আপনি প্রত্যাশিত রানটাইম ফাংশনের উপরের একটি বাউন্ডের কথা বলছেন যা স্পষ্টভাবে সংজ্ঞায়িত গাণিতিক ফাংশন। অন্যথায় আপনার উত্তরটি তেমন কোনও অর্থ দেয় না।
ldog

1
গ্যাম্যাট: আমি নিশ্চিত নই যে আমি আপনার আপত্তি বুঝতে পেরেছি: বিগ-ও স্বরলিপি সংজ্ঞা অনুসারে ফাংশনটির উপরের একটি আবদ্ধ । আমি আর কি বলতে পারি?
কনরাড রুডলফ

3
কম্পিউটারের সাহিত্যে সাধারণত আপনি দেখতে পান যে বড় ও স্বরলিপিটি একটি অ্যালগরিদমের রানটাইম বা স্পেস জটিলতার ফাংশনগুলিতে একটি উপরের বাউন্ডের প্রতিনিধিত্ব করে। এক্ষেত্রে উপরের সীমানাটি সেই প্রত্যাশায় থাকে যা নিজেই কোনও ফাংশন নয় তবে ফাংশনগুলির একটি অপারেটর (র‌্যান্ডম ভেরিয়েবলস) এবং বাস্তবে এটি একটি অবিচ্ছেদ্য (লেবেসগ।) সত্য যে আপনি এ জাতীয় জিনিসকে আবদ্ধ করতে পারেন তা গ্রহণ করা উচিত নয় should অনুমোদিত এবং তুচ্ছ নয়।
ldog

31

জাভাতে, হ্যাশম্যাপ বালতি সনাক্ত করতে হ্যাশকোড ব্যবহার করে কাজ করে। প্রতিটি বালতি সেই বালতিতে থাকা আইটেমগুলির একটি তালিকা। তুলনা করার জন্য সমান ব্যবহার করে আইটেমগুলি স্ক্যান করা হয়। আইটেমগুলি যুক্ত করার সময়, নির্দিষ্ট লোড শতাংশ পৌঁছে গেলে হ্যাশম্যাপটি পুনরায় আকার দেওয়া হয়।

সুতরাং, কখনও কখনও এটি কয়েকটি আইটেমের সাথে তুলনা করতে হবে তবে সাধারণত এটি ও (এন) এর চেয়ে ও (1) এর থেকে অনেক বেশি কাছাকাছি রয়েছে। ব্যবহারিক উদ্দেশ্যে, আপনার এটি জানা দরকার all


11
ঠিক আছে, যেহেতু বিগ-ও-এর সীমা নির্দিষ্ট করার কথা, তাই এটি ও (1) এর কাছাকাছি কিনা বা না তা কোনও পার্থক্য করে না। এমনকি ও (এন / 10 ^ 100) এখনও ও (এন)। আমি দক্ষতা আনার পরে অনুপাত কমিয়ে আনার বিষয়ে আপনার বক্তব্যটি পেয়েছি তবে এটি এখনও অ্যালগরিদমকে ও (এন) এ রাখে।
paxdiablo

4
হ্যাশ-ম্যাপ বিশ্লেষণ সাধারণত গড় ক্ষেত্রে হয় যা ও (1) (কোলিশন সহ) সবচেয়ে খারাপ ক্ষেত্রে আপনার ও (এন) থাকতে পারে তবে সাধারণত এটি হয় না। পার্থক্য সম্পর্কে - ও (1) এর অর্থ হ'ল চার্টে আইটেমের পরিমাণ নির্বিশেষে আপনি একই অ্যাক্সেস সময় পান এবং সাধারণত এটি হয় (যতক্ষণ না টেবিলের আকার এবং 'এন এর মধ্যে একটি ভাল অনুপাত থাকে ')
লিরান ওরেভি

4
এটি লক্ষণীয় যে এটি এখনও ঠিক (O), যদিও বালতি স্ক্যান করতে কিছুক্ষণ সময় নেয় কারণ এতে ইতিমধ্যে কিছু উপাদান রয়েছে। যতক্ষণ বালতিগুলির নির্দিষ্ট সর্বোচ্চ আকার থাকে, তবে এটি ও () শ্রেণিবিন্যাসের অপ্রাসঙ্গিক কেবল একটি ধ্রুবক ফ্যাক্টর। তবে অবশ্যই "অনুরূপ" কী যুক্ত করার সাথে আরও আরও উপাদান থাকতে পারে, যাতে এই বালতিগুলি উপচে পড়ে যায় এবং আপনি আর একটি ধ্রুবকের গ্যারান্টি দিতে পারবেন না।
sth

@sth কেন বালতিগুলির স্থির সর্বাধিক আকার থাকে !?
নবীন

31

মনে রাখবেন যে ও (1) এর অর্থ এই নয় যে প্রতিটি তাত্পর্য কেবলমাত্র একটি আইটেম পরীক্ষা করে - এর অর্থ এই যে চেক করা আইটেমগুলির গড় সংখ্যা ধারকটিতে থাকা আইটেমগুলির সংখ্যা স্থির থাকে। সুতরাং যদি 100 আইটেম সহ একটি পাত্রে কোনও আইটেম সন্ধান করতে গড়ে 4 টি তুলনা লাগে তবে 10000 আইটেমযুক্ত একটি পাত্রে কোনও আইটেম সন্ধান করতেও গড়ে 4 টি তুলনা নেওয়া উচিত এবং অন্য যে কোনও সংখ্যক আইটেমের জন্য (সর্বদা একটি কিছুটা বৈকল্পিক, বিশেষত সেই পয়েন্টগুলির আশেপাশে যেখানে হ্যাশ টেবিলটি পুনঃসংশ্লিষ্ট করে এবং যখন খুব কম সংখ্যক আইটেম থাকে)।

সুতরাং সংঘর্ষগুলি কনটেইনারকে ও (1) পরিচালনা করতে বাধা দেয় না, যতক্ষণ না প্রতি বালতিতে প্রতি কিসের গড় সংখ্যা একটি নির্দিষ্ট গণ্ডির মধ্যে থাকে।


16

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আসলে এটির একটি নতুন উত্তর রয়েছে।

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

তবে এটি অনুসরণ করে না যে আসল সময়ের জটিলতা - কারণ O(n)কোনও নিয়ম নেই যা বলছে যে বালতিগুলি একটি রৈখিক তালিকা হিসাবে প্রয়োগ করতে হবে।

প্রকৃতপক্ষে, জাভা 8 বালতিগুলি TreeMapsযখন একটি থ্রেশহোল্ড ছাড়িয়ে যায় তখন প্রয়োগ করে , যা প্রকৃত সময় করে O(log n)


4

যদি বালতিগুলির সংখ্যা (একে কল করুন বি) ধ্রুবকভাবে রাখা হয় (সাধারণ ক্ষেত্রে), তবে অনুসন্ধানটি আসলে ও (এন) is
এন বড় হওয়ার সাথে সাথে প্রতিটি বালতিতে উপাদানগুলির সংখ্যা গড়ে এন / বি হয়। যদি সংঘর্ষের রেজোলিউশনটি একটি সাধারণ উপায়ে করা হয় (উদাহরণস্বরূপ লিংকযুক্ত তালিকা), তবে অনুসন্ধানটি ও (এন / বি) = ও (এন)।

এন সংক্ষিপ্ত আকারে বড় হয়ে ওঠে তখন কী হয় সে সম্পর্কে ও নোটেশনটি। নির্দিষ্ট অ্যালগরিদমে প্রয়োগ করার সময় এটি বিভ্রান্তিকর হতে পারে এবং হ্যাশ টেবিলগুলি বিন্যাসে একটি কেস। আমরা কয়টি উপাদান মোকাবিলা করার প্রত্যাশা করছি তার উপর ভিত্তি করে আমরা বালতিগুলির সংখ্যা নির্বাচন করি। যখন এন বি এর সমান আকারের হয়, ততক্ষণ অনুসন্ধান প্রায় ধ্রুবক-সময়, তবে আমরা এটিকে ও (1) বলতে পারি না কারণ এন → ∞ হিসাবে একটি সীমা অনুসারে ওকে সংজ্ঞায়িত করা হয় ∞



2

আমরা প্রতিষ্ঠিত করেছি যে হ্যাশ টেবিলের অনুসন্ধানের O (1) এর স্ট্যান্ডার্ড বিবরণটি গড়-কেস প্রত্যাশিত সময়কে বোঝায়, কঠোরতম খারাপ-কর্মক্ষমতা নয়। চেইনিংয়ের সাথে সংঘর্ষগুলির সমাধান করার জন্য একটি হ্যাশ টেবিলের জন্য (জাভা এর হ্যাশম্যাপের মতো) এটি হ্যাশ ফাংশন সহ প্রযুক্তিগতভাবে ও (1 + α) , যেখানে the সারণির লোড ফ্যাক্টর। আপনি যতক্ষণ অবজেক্ট করে রাখছেন ততক্ষণ ধ্রুবক টেবিলের আকারের চেয়ে ধ্রুবক ফ্যাক্টরের চেয়ে বেশি কিছু নয়।

এটি আরও ব্যাখ্যা করা হয়েছে যে কঠোরভাবে বলতে গেলে কোনও ইনট্রিমেন্টিক হ্যাশ ফাংশনটির জন্য ও ( এন ) লকআপগুলির প্রয়োজন এমন ইনপুট তৈরি করা সম্ভব । তবে সবচেয়ে খারাপ- প্রত্যাশিত সময়কে বিবেচনা করাও আকর্ষণীয় , যা গড় অনুসন্ধানের সময়ের চেয়ে আলাদা। এটি শৃঙ্খলাবদ্ধকরণ ব্যবহার করে ও ((দীর্ঘতম চেইনের দৈর্ঘ্য 1+)) উদাহরণস্বরূপ Θ (লগ এন / লগ লগ এন ) যখন α = 1 হয়।

আপনি যদি ধ্রুবক সময়ের প্রত্যাশা সবচেয়ে খারাপ ক্ষেত্রে দেখার জন্য তাত্ত্বিক উপায়ে আগ্রহী হন তবে আপনি গতিশীল নিখুঁত হ্যাশিং সম্পর্কে পড়তে পারেন যা অন্য হ্যাশ টেবিলের সাথে সংঘর্ষগুলির পুনরাবৃত্তভাবে সমাধান করে!


2

আপনার হ্যাশিং ফাংশনটি খুব ভাল হলেই এটি ও (1)। জাভা হ্যাশ টেবিল বাস্তবায়ন খারাপ হ্যাশ ফাংশন থেকে রক্ষা করে না।

আপনি আইটেমগুলি যুক্ত করার সময় আপনার টেবিলটি বাড়ানো দরকার কিনা তা প্রশ্নের সাথে প্রাসঙ্গিক নয় কারণ এটি দেখার সময় সম্পর্কিত।


2

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

location = (arraylength - 1) & keyhashcode

এখানে & বিটওয়াইড এবং অপারেটর উপস্থাপন করে।

উদাহরণ স্বরূপ: 100 & "ABC".hashCode() = 64 (location of the bucket for the key "ABC")

গেট অপারেশনের সময় এটি কীটির জন্য বালতির অবস্থান নির্ধারণ করতে একইভাবে ব্যবহার করে। সর্বোত্তম ক্ষেত্রে প্রতিটি কীতে স্বতন্ত্র হ্যাশকোড থাকে এবং প্রতিটি চাবির জন্য একটি অনন্য বালতিতে ফলস্বরূপ, এই ক্ষেত্রে প্রাপ্ত পদ্ধতিটি কেবল বালতির অবস্থান নির্ধারণ করতে এবং ধ্রুবক ও (1) মানটি পুনরুদ্ধার করতে সময় ব্যয় করে।

সবচেয়ে খারাপ ক্ষেত্রে, সমস্ত কীগুলির একই হ্যাশকোড রয়েছে এবং একই বালতিতে সঞ্চিত রয়েছে, ফলস্বরূপ পুরো তালিকাটি অতিক্রম করে যা হে (এন) এর দিকে নিয়ে যায়।

জাভা 8 এর ক্ষেত্রে, লিঙ্কযুক্ত তালিকার বালতিটি ট্রিম্যাপ দিয়ে প্রতিস্থাপন করা হয় যদি আকারটি 8 টিরও বেশি বৃদ্ধি পায় তবে এটি ও (লগ এন) এর নিকৃষ্টতম অনুসন্ধানের দক্ষতা হ্রাস করে।


1

এটি মূলত বেশিরভাগ প্রোগ্রামিং ভাষায় বেশিরভাগ হ্যাশ টেবিল বাস্তবায়নের জন্য যায় কারণ অ্যালগরিদম নিজেই সত্যিই পরিবর্তন হয় না।

যদি টেবিলটিতে কোনও সংঘর্ষের উপস্থিতি না থাকে তবে আপনাকে কেবলমাত্র একটি একক চেহারা করতে হবে, সুতরাং চলমান সময়টি ও (1)। যদি সংঘর্ষগুলি উপস্থিত থাকে তবে আপনাকে একাধিক লুক আপ করতে হবে, যা ও (এন) এর দিকে কর্মক্ষমতা হ্রাস করে।


1
এটি ধরে নিয়েছে যে চলমান সময়টি দেখার সময় দ্বারা সীমাবদ্ধ। অনুশীলনে আপনি অনেকগুলি পরিস্থিতি পাবেন যেখানে হ্যাশ ফাংশন সীমানা সরবরাহ করে (স্ট্রিং)
স্টিফান এগারমন্ট

1

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


1

একাডেমিকদের ব্যবহারিক দৃষ্টিকোণ থেকে বাদ দিয়ে, হ্যাশম্যাপসকে একটি অসম্পূর্ণ কর্মক্ষমতা প্রভাব হিসাবে গ্রহণ করা উচিত (যদি না আপনার প্রোফাইলার অন্যথায় আপনাকে বলেন না))


4
ব্যবহারিক প্রয়োগগুলিতে নয়। আপনি কী হিসাবে কোনও স্ট্রিং ব্যবহার করার সাথে সাথে আপনি লক্ষ্য করবেন যে সমস্ত হ্যাশ ফাংশন আদর্শ নয় এবং কিছু সত্যই ধীর।
স্টিফান এগারমন্ট

1

কেবল তাত্ত্বিক ক্ষেত্রে, যখন হ্যাশকোডগুলি সর্বদা পৃথক থাকে এবং প্রতিটি হ্যাশ কোডের জন্য বালতিও আলাদা হয়, তখন ও (1) উপস্থিত থাকবে। অন্যথায়, এটি স্থির ক্রম হয় অর্থাৎ হ্যাশম্যাপের বর্ধনের ক্ষেত্রে, অনুসন্ধানের ক্রমটি স্থির থাকে।


0

অবশ্যই হ্যাশম্যাপের কার্যকারিতা প্রদত্ত বস্তুর জন্য হ্যাশকোড () ফাংশনের মানের উপর নির্ভর করবে। তবে, যদি ফাংশনটি এমনভাবে প্রয়োগ করা হয় যাতে সংঘর্ষের সম্ভাবনা খুব কম থাকে তবে এটির খুব ভাল পারফরম্যান্স হবে (এটি প্রতিটি সম্ভাব্য ক্ষেত্রে কঠোরভাবে ও (1) নয় তবে এটি বেশিরভাগ ক্ষেত্রেই হয়)।

উদাহরণস্বরূপ ওরাকল জেআরই-তে ডিফল্ট বাস্তবায়নটি একটি এলোমেলো সংখ্যা ব্যবহার করা হয় (যা বস্তুতে সঞ্চিত থাকে যাতে এটি পরিবর্তন না হয় - তবে এটি পক্ষপাতদুষ্ট লকটিও অক্ষম করে তোলে, তবে এটি অন্য একটি আলোচনা) সুতরাং সংঘর্ষের সম্ভাবনা রয়েছে খুবই নিন্ম.


"এটি বেশিরভাগ ক্ষেত্রে"। আরও সুনির্দিষ্টভাবে বলা যায়, মোট সময় কে কে N এর দিকে ঝুঁকবে (যেখানে কে ধ্রুবক রয়েছে) যেহেতু এন অসীমের দিকে ঝোঁক।
ক্রিসডাব্লু

7
এটা ভুল. হ্যাশ টেবিলের সূচকটি নির্ধারিত হতে চলেছে hashCode % tableSizeযার মাধ্যমে অবশ্যই সংঘর্ষ হতে পারে। আপনি 32-বিটগুলির পুরো ব্যবহার পাচ্ছেন না। এই জাতীয় হ্যাশ টেবিলের বিন্দু ... আপনি একটি বড় ইনডেক্সিং স্পেসকে ছোট একটিতে হ্রাস করেন।
ফোগলবার্ড

1
"আপনাকে গ্যারান্টি দেওয়া আছে যে কোনও সংঘর্ষ হবে না" না আপনি কারণ হচ্ছেন না কারণ ম্যাপের আকার হ্যাশের আকারের চেয়ে ছোট: উদাহরণস্বরূপ যদি মানচিত্রের আকার দুটি হয় তবে একটি সংঘর্ষের নিশ্চয়তা রয়েছে (কোনও ব্যাপার নয়) কি হ্যাশ) যদি / আমি তিনটি উপাদান সন্নিবেশ করার চেষ্টা করি।
ক্রিসডাব্লু

তবে কীভাবে আপনি একটি (কী) থেকে ও (1) এর মেমরি ঠিকানায় রূপান্তর করবেন? আমার অর্থ x = অ্যারে ["কী"] এর মতো। কীটি মেমোরি ঠিকানা নয় তাই এটি এখনও ও (এন) সন্ধান করতে হবে।
প্যাক্সিডিয়াবলো

1
"আমি বিশ্বাস করি আপনি যদি হ্যাশকোড প্রয়োগ না করেন তবে এটি বস্তুর মেমরি ঠিকানা ব্যবহার করবে"। এটি এটি ব্যবহার করতে পারে তবে মানক ওরাকল জাভার জন্য ডিফল্ট হ্যাশকোড আসলে 25-বিট র্যান্ডম নম্বর অবজেক্ট শিরোনামে সঞ্চিত, সুতরাং 64/32-বিটের কোনও ফল হয় না।
বোয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.