হ্যাশ টেবিল বনাম বাইনারি গাছ


30

অভিধান প্রয়োগ করার সময় ('আমি তাদের গ্রাহক আইডি দ্বারা গ্রাহকদের ডেটা সন্ধান করতে চাই'), ব্যবহৃত আদর্শ তথ্য কাঠামো হ্যাশ টেবিল এবং বাইনারি অনুসন্ধান গাছ। আমি উদাহরণস্বরূপ জানি যে সি ++ এসটিএল গ্রন্থাগারটি (ভারসাম্যপূর্ণ) বাইনারি অনুসন্ধান গাছ ব্যবহার করে অভিধানগুলি (তারা তাদের মানচিত্র বলে) প্রয়োগ করে এবং .NET ফ্রেমওয়ার্কটি হুডের নীচে হ্যাশ টেবিল ব্যবহার করে।

এই ডেটা স্ট্রাকচারের সুবিধা এবং অসুবিধাগুলি কী কী? কিছু অন্যান্য বিকল্প আছে যা কিছু পরিস্থিতিতে যুক্তিসঙ্গত?

নোট করুন যে কীগুলিতে একটি শক্তিশালী অন্তর্নিহিত কাঠামো রয়েছে সে ক্ষেত্রে আমি বিশেষভাবে আগ্রহী নই, বলুন যে তারা সমস্ত 1 এবং n বা কোনও কিছুর মধ্যে পূর্ণসংখ্যা।


1
আমি আপনাকে হতাশ করব কিন্তু আপনি কেবল "1 এবং n এর মধ্যে পূর্ণসংখ্যার" বলতে পারবেন না কারণ সেই ক্ষেত্রে একটি অ্যারে অন্য সমস্ত ডেটা স্ট্রাকচারকে ছাড়িয়ে যাবে :-)। "স্ট্রিংস" ন্যায্য বলে মনে হচ্ছে এবং বেশিরভাগ পরিস্থিতি coversেকে রাখে।
jmad

@ জাজাদ তিনি বলেছিলেন যে তিনি এই মামলায় আগ্রহী নন
জো

@ জো আমি ভেবেছিলাম এটি পরিষ্কার ছিল আমি এটি আমলে নিয়েছি। যাইহোক এটি চাবির সবচেয়ে খারাপ উদাহরণ দেওয়ার কোনও কারণ নয়।
jmad

1
প্রকৃতপক্ষে .NET- তে হ্যাশ টেবিল ব্যবহার করে প্রয়োগ করা গাছ এবং অভিধান ব্যবহার করে উভয় অভিধান প্রয়োগ করা হয়েছে (এবং তাই ২০১১ এর মান থেকে সি ++ রয়েছে)।
sepp2k

উত্তর:


26

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

সংক্ষিপ্ত উত্তর হ্যাশ টেবিলগুলি বেশিরভাগ ক্ষেত্রে দ্রুত হয় তবে তাদের নিকৃষ্টতম অবস্থাতে খুব খারাপ হতে পারে। অনুসন্ধান গাছগুলির বেশ কয়েকটি সুবিধাগুলি রয়েছে যার মধ্যে সবচেয়ে খারাপ-আচরণ আচরণ রয়েছে তবে সাধারণ ক্ষেত্রে কিছুটা ধীর হয়।

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

হ্যাশ টেবিলগুলি আরও কিছু পরিবর্তনশীল। তাদের জন্য প্রায় পয়েন্টারের অ্যারে প্রয়োজন require একটি উপাদান অ্যাক্সেস হ্যাশ ফাংশন মানের উপর নির্ভর করে। একটি হ্যাশ ফাংশনের উদ্দেশ্য উপাদানগুলি ছড়িয়ে দেওয়া। একটি হ্যাশ টেবিল "কাজ করে" যদি আপনি এটি সংরক্ষণ করতে চান এমন সমস্ত উপাদান আলাদা আলাদা হ্যাশ করে। যদি এটি হয়, তবে মৌলিক ক্রিয়াকলাপগুলি (চেহারা, সন্নিবেশ, মোছা) মোটামুটি ছোট ধ্রুবক (একটি হ্যাশ গণনা এবং একটি পয়েন্টার লুকআপ) সহ সময় নেয়। এটি অনেকগুলি সাধারণ ক্ষেত্রে হ্যাশ টেবিলগুলি খুব দ্রুত তৈরি করে।( 1 )2nO(1)

হ্যাশ টেবিলগুলির সাথে একটি সাধারণ সমস্যা হ'ল জটিলতার নিশ্চয়তা নেই।O(1)

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

আপনি যখন মিশ্রণে ডেটা লোকালটি নিক্ষেপ করেন তখন হ্যাশ টেবিলগুলি খারাপভাবে কাজ করে। তারা যথাযথভাবে কাজ করে কারণ তারা সম্পর্কিত উপাদানগুলি দূরে সরিয়ে রাখে, এর অর্থ হল যদি অ্যাপ্লিকেশনটি ধারাবাহিকভাবে একটি উপসর্গ ভাগ করে এমন উপাদানগুলি দেখায় তবে এটি ক্যাশে প্রভাবগুলি থেকে উপকৃত হবে না। যদি অ্যাপ্লিকেশনটি মূলত এলোমেলোভাবে অনুসন্ধান করে তবে এটি প্রাসঙ্গিক নয়।

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

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

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

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

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


2
বিএসটিগুলিরও কি ডেটা লোকাল খারাপ নেই?
সুইভ

@ এসভিক নোডগুলি কীভাবে বরাদ্দ করা হয়েছে তার উপর নির্ভর করে তারা হয়ত বা নাও থাকতে পারে। গাছের শালীনতা বাড়ানো চলমান সময়ের সাথে আপস না করে সহায়তা করতে পারে (ব্যয়টি আরও বড় এবং আরও জটিল কোড)।
গিলস 21'17

2
একটি বিএসটিতে উপাদানগুলি "ক্রম" পাওয়া সহজ, একটি হ্যাশ টেবিলের জন্য এটি প্রশ্ন থেকে যায়।
ভোনব্র্যান্ড

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

@ কিথ'পি 1 কে "গাছ শেষ করতে" বলতে কী বোঝ? হ্যাশ টেবিলগুলির বিন্দুটি হ'ল পুরো গাছের জন্য নয়, একবারে একটি মানকে অ্যাক্সেস করা, অন্যথায় একটি তালিকা বা অ্যারে আরও ভাল কাজ করবে। এমনকি সিটেশনগুলিতে যেখানে গড় মূল্য হ'ল গুরুত্বপূর্ণ (যা সর্বদা ক্ষেত্রে হয় না, যেমন আপনার রিয়েলটাইম সীমাবদ্ধতা থাকে), এটি নির্দিষ্ট পরিস্থিতিতে যে অনুরোধগুলি করা হয় তার চেয়ে গড় গড়, যা প্রায়শই টেবিলের উপরে একসাথে থাকে না are - যেমন একটি নির্দিষ্ট উপসর্গ পক্ষপাতদুষ্ট।
গিলস 'অশুভ হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.