পৃথক শৃঙ্খলার জন্য বাইনারি অনুসন্ধান গাছগুলি ব্যবহার করে কি কোনও হ্যাশ টেবিলটি দ্রুত করা সম্ভব?


11

আমি ও (এন) (সংযুক্ত তালিকা ব্যবহার করে) থেকে ও (লগ এন) (বিএসটি ব্যবহার করে) পৃথক চেইনিং প্রক্রিয়ায় অনুসন্ধানের জটিলতা হ্রাস করতে বাইনারি অনুসন্ধান গাছগুলি ব্যবহার করে একটি হ্যাশ টেবিল প্রয়োগ করতে চাই। এটি করা যেতে পারে, এবং যদি হ্যাঁ হয় তবে কীভাবে? সমাধানটি যদি ধাপে ধাপে হয়, যুক্তির বাস্তবায়ন হয় তবে এটি বোঝা সহজ হবে।

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


4
হ্যাশ টেবিল এবং বাইনারি অনুসন্ধান গাছগুলি বিভিন্ন ধারক। সুতরাং আপনার পরামর্শ অনুসারে আপনি যা করতে পারবেন না (বা আপনি একটি পরিভাষাগত ভুল করছেন)।
বেসিল স্টারিনকিভিচ

আমার ধারণা আপনি একটি গাছে প্রতিটি নোডে একটি হ্যাশ / মান জোড় রাখতে পারেন ... তবে এটি হ্যাশ টেবিল বা খারাপ বাইনারি গাছ হতে পারে। আপনি কেন একেবারেই এটি করতে চান এবং শেষ ফলাফলটি আপনি কীভাবে সক্ষম হতে চান তা সম্পর্কে কিছুটা ছাড়াই, আমি নিশ্চিত নই যে এটি সত্যই জবাবদিহি করতে পারে।
Ixrec

1
@ ক্যাক: আপনি যেমন বলেছিলেন তেমন কিছু করুন up আমি বাইনারি অনুসন্ধান ট্রি ব্যবহার করে সংঘর্ষগুলি পরিচালনা করতে চাই। আমি আমার প্রশ্নটি আরও পরিষ্কার করার জন্য কিছুটা সংশোধন করেছি।
অ্যাভিরাল

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

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

উত্তর:


11

আপনি যা জিজ্ঞাসা করছেন তা আপনার সীমাবদ্ধতার কারণে সম্ভব।

বিশ্লেষণ

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

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

একটি হ্যাশ টেবিল এ জাতীয় কোনও বিধিনিষেধ আরোপ করে না: একটি হ্যাশ টেবিলের উপাদানগুলির দুটি বৈশিষ্ট্য থাকতে হবে। প্রথমত, তারা সমতুল্য কিনা তা নির্ধারণের জন্য অবশ্যই একটি উপায় থাকতে হবে; দ্বিতীয়ত, একটি ডিস্ট্রিমেন্টিক হ্যাশ কোড গণনা করার উপায় থাকতে হবে। অর্ডার কোনও প্রয়োজন হয় না।

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

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

বাস্তবায়ন

আমি এখানে কোড রাখছি না কারণ সত্যই এটি সত্যিই প্রয়োজনীয় নয় এবং আপনি যেভাবে কোনও ভাষা দেননি।

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

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


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

@ স্টিভ 314 মনে রাখবেন যে সমস্যাটি প্রচুর সংঘর্ষে রয়েছে, তাই তিনি আশা করেন যে একটি বালতি সাধারণত হ্যাশ টেবিলের চেয়ে বেশি আইটেম ধারণ করে।

ভাল পয়েন্ট - উদাহরণস্বরূপ আনবাউন্ডেড ডেটা সহ ধ্রুবক আকারের হ্যাশ টেবিলের জন্য, হ্যাশ টেবিলের অ্যাসিম্পটোটিক পারফরম্যান্স সংঘর্ষের হ্যান্ডলিংয়ের অ্যাসিপটোটিক পারফরম্যান্সের সমান - হ্যাশ টেবিলটি কেবল ধ্রুবক কারণগুলিকে পরিবর্তন করে।
স্টিভ 314

@ স্টিভ 314 ডান, মূলত যদি হ্যাশ টেবিল কার্যকরভাবে প্রতিটি বালতিতে উপাদানগুলির সংখ্যা সীমাবদ্ধ করতে না পারে, অ্যাসিম্পটোটিক পারফরম্যান্স প্রতিটি বালতিতে যে কোনও উপ-ডেটা কাঠামো ব্যবহৃত হয় তার মধ্যে হ্রাস পায়। এটি পরিষ্কার করার জন্য আমি আমার উত্তরে একটি অনুচ্ছেদ যুক্ত করেছি।

7

হ্যাশ টেবিলের সাথে সংঘর্ষের জন্য বাইনারি ট্রি ব্যবহার করা কেবল সম্ভব নয় - এটি করা হয়ে গেছে।

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

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

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