হ্যাশিং ফাংশনে মোড হিসাবে একটি প্রাথমিক সংখ্যা ব্যবহার করা ভাল কেন?


57

যদি আমার কাছে 1 থেকে 100 পর্যন্ত মূল মানগুলির একটি তালিকা থাকে এবং আমি 11 টি বালতির একটি অ্যারে এগুলি সংগঠিত করতে চাই তবে আমাকে একটি আধুনিক ফাংশন গঠন করতে শেখানো হয়েছে

H=kmod 11

এখন সমস্ত মান 9 সারিতে একের পর এক স্থাপন করা হবে। উদাহরণস্বরূপ, প্রথম বালতিতে 0,11,22 । দ্বিতীয়টিতে, 1,12,23 ইত্যাদি থাকবে

ধরা যাক আমি খারাপ ছেলে হওয়ার সিদ্ধান্ত নিয়েছি এবং আমার হ্যাশিং ফাংশন হিসাবে একটি অ-প্রাইম ব্যবহার করব - 12 নিন take

H=kmod 12

প্রথম বালতিতে 0,12,24 দ্বিতীয়টিতে 1,13,25 ইত্যাদির সাথে একটি হ্যাশ টেবিল তৈরি হবে।

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


প্রাসঙ্গিক প্রশ্ন, আমরা কেন হ্যাশ-ফাংশন
স্ট্যাকওভারফ্লো.com

উত্তর:


62

কীগুলির সেট এবং একটি হ্যাশ টেবিল বিবেচনা করুন যেখানে বালতির সংখ্যা । যেহেতু একটি ফ্যাক্টর , কি যে গুণিতক বাকেট যে গুণিতক হয় কুচি-কুচি করিয়া কাটা বস্তু করা হবে :K={0,1,...,100}m=1231233

  • কীগুলি বালতি ।{0,12,24,36,...}0
  • কীগুলি বালতি ।{3,15,27,39,...}3
  • কীগুলি বালতি ।{6,18,30,42,...}6
  • কীগুলি বালতিতে হ্যাশ করা হবে ।{9,21,33,45,...}9

তাহলে অবিশেষে বিতরণ করা হয় (অর্থাত, প্রতিটি চাবি সমানভাবে ঘটতে পারে), তারপর পছন্দমত তাই সমালোচনামূলক নয়। তবে, একত্রে বিতরণ না করলে কী হবে ? কল্পনা করুন যে কীগুলি সম্ভবত ঘটে থাকে তা হ'ল এর গুণক । এই ক্ষেত্রে, বালির যেগুলি গুণক নয় সমস্তগুলি উচ্চ সম্ভাবনার সাথে খালি হবে (যা হ্যাশ টেবিলের কার্যকারিতার ক্ষেত্রে সত্যই খারাপ)।KKmK33

এই পরিস্থিতি আরও সাধারণ যা এটি মনে হতে পারে। উদাহরণস্বরূপ, কল্পনা করুন যে আপনি বস্তুগুলি মেমরিতে কোথায় সঞ্চয় করা হয়েছে তার উপর ভিত্তি করে ট্র্যাক রাখছেন। যদি আপনার কম্পিউটারের শব্দের আকার চার বাইট হয়, তবে আপনি হ্যাশিং কীগুলি হবেন যা এর গুণক । একাধিক হিসাবে বেছে নেওয়া একটি ভয়ঙ্কর পছন্দ হবে তা বলার অপেক্ষা রাখে না : আপনার কাছে বালতি সম্পূর্ণ খালি থাকবে এবং আপনার সমস্ত কী কী বাকী বালতিতে সংঘর্ষে থাকবে ।4m43m/4m/4

সাধারণভাবে:

প্রতিটি কী যা বালিকে সংখ্যার সাথে একটি সাধারণ ফ্যাক্টর ভাগ করে একটি বালতিতে হ্যাশ করা হবে যা এই ফ্যাক্টরের একাধিক।Km

সুতরাং, সংঘর্ষগুলি হ্রাস করতে, এবং এর উপাদানগুলির মধ্যে সাধারণ কারণগুলির সংখ্যা হ্রাস করা গুরুত্বপূর্ণ । কিভাবে এটা অর্জন করা যেতে পারে? খুব কম কারণের একটি সংখ্যা হিসাবে নির্বাচন করে: একটি মৌলিক সংখ্যাmKm


আমি সবেমাত্র দেখেছি যে আমার ক্যোয়ারী আপনার উত্তরের সাথে সারিবদ্ধ। আপনি কি মনে করেন যে আমার ক্যোয়ারীতে হ্যাশ ফাংশনটি ভাল ধরেছে?
ওভাররেঞ্জচেঞ্জ

@ সার্বভৌম পরিবর্তন: আমি আপনার প্রশ্নের জবাব দিয়েছি । এই উত্তরটি আপনার পক্ষেও আগ্রহী হতে পারে।
মারিও সেরভেরা 18

কেন কেন এম এর পছন্দ বিবেচনা করে কেবল কে কে স্কিউ করা হয়? এটা কি সত্য নয় যে কে অভিন্নভাবে বিতরণ করা হলেও আমাদের খারাপ মি নিয়ে খারাপ পারফরম্যান্স হবে?
ভোরো

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

16

প্রাইমগুলি ব্যবহার করে সংঘর্ষ কম হওয়ার সম্ভাবনা রয়েছে কিনা তা আপনার কীগুলি বিতরণের উপর নির্ভর করে।

যদি আপনার বেশিরভাগ কীতে এবং আপনার হ্যাশ ফাংশন , তবে এই কীগুলি বালতিগুলির একটি ছোট iff বিভক্ত হলে । সুতরাং আপনি যেমন এর সংখ্যা হ্রাস করা উচিত , যা একটি প্রধান নির্বাচন করে অর্জন করা যেতে পারে।a+kbH(n)=nmodmbnb

অন্যদিকে আপনি যদি থেকে বালতি রাখতে চান এবং আপনি জানেন যে এবং এর গুণাবলীর চেয়ে এর গুণকগুলি তার চেয়ে বেশি হয় তবে আপনি আপনার বিশেষ অ্যাপ্লিকেশনের জন্য চয়ন করতে পারেন ।1112112312


1
কিন্তু আমার কি ফর্ম না থাকলে তারপর কোন ব্যাপার না? এটা কি সঠিক? a+k×bm
কোডিবাগস্টিন

1
@lmray, যদি আপনার কী-অবিশেষে বিতরণ করা হয়, কোন ব্যাপার না। যদি তারা না থাকে তবে এটি জন্য সঠিক পরিমাণে বিতরণের উপর নির্ভর করবে । mm
এপ্রোগ্রামার

সবেমাত্র শেষ সম্পাদনাটি উল্টানো হয়েছে, আমি ভুলে গিয়েছি । 12>11
ফ্রেফএল

3
আপনি কি বোঝাতে চেয়েছেন যে, "বাকেট একটি ছোট উপশাখা যেতে iff ভাগ "? bm
মিখাইল ডুবভ

8

এর কোনও প্রভাব রয়েছে কিনা (এছাড়াও) আপনি সংঘর্ষগুলি কীভাবে আচরণ করবেন তার উপর নির্ভর করে। ওপেন হ্যাশিংয়ের কিছু বৈকল্পিকগুলি ব্যবহার করার সময়, প্রাইমগুলি ব্যবহারের গ্যারান্টি রয়েছে খালি স্লট পাওয়া যাবে যতক্ষণ না টেবিল পর্যাপ্ত খালি থাকে।

উদাহরণস্বরূপ নিম্নলিখিতগুলি দেখানোর চেষ্টা করুন:

ধরে আমরা একটি উপাদান মোকাবেলার হ্যাশ যে সন্নিবেশ করতে চান এবং অবস্থানের চেষ্টা করে দুর্ঘটনায় সমাধান জন্য পরবর্তীকালে ।aa+i2i=1,2,

দেখান যে এই প্রক্রিয়াটি সর্বদা একটি খালি অবস্থান দেয় যদি হ্যাশ টেবিলটি আকারের , চেয়ে বড় হয় এবং সমস্ত অবস্থানের কমপক্ষে অর্ধেক নিখরচায় থাকে।pp3

ইঙ্গিত: এই সত্যটি ব্যবহার করুন যে অবশিষ্টাংশ শ্রেণির রিং মডুলো একটি ক্ষেত্র যদি প্রধান হয় এবং তাই সর্বাধিক সমাধান রয়েছে।ppi2=c2


2

আপনার হ্যাশ ফাংশন ফর্মের হয় তাহলে যেখানে মৌলিক এবং র্যান্ডম, তারপর সম্ভাব্যতা এ নির্বাচিত যে একই বালতি হ্যাশ 2 স্বতন্ত্র কী । সুতরাং , যা খুব ছোট।h(k)=a×kmodmma1mm=1009Pr{h(x)=h(y),xy}=0.00099108027

এই স্কিমটি পরিচিত: ইউনিভার্সাল হ্যাশিং।

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