এই বিষয়টিতে একটি সম্পূর্ণ গ্রন্থ রচনা করা যেতে পারে; আমি কেবল কয়েকটি স্পষ্ট বিষয়গুলি আবরণ করতে যাচ্ছি, এবং আমি অন্যান্য ডেটা স্ট্রাকচারের আলোচনাকে সর্বনিম্ন রাখব (আসলে অনেকগুলি রূপ রয়েছে)। এই উত্তরের সর্বত্র, হ'ল অভিধানে কীগুলির সংখ্যা।n
সংক্ষিপ্ত উত্তর হ্যাশ টেবিলগুলি বেশিরভাগ ক্ষেত্রে দ্রুত হয় তবে তাদের নিকৃষ্টতম অবস্থাতে খুব খারাপ হতে পারে। অনুসন্ধান গাছগুলির বেশ কয়েকটি সুবিধাগুলি রয়েছে যার মধ্যে সবচেয়ে খারাপ-আচরণ আচরণ রয়েছে তবে সাধারণ ক্ষেত্রে কিছুটা ধীর হয়।
ভারসাম্যযুক্ত বাইনারি অনুসন্ধান গাছগুলির মধ্যে একটি সমান জটিলতা থাকে: প্রতিটি উপাদান গাছের একটি নোড নেয় (সাধারণত মেমরির 4 শব্দ), এবং প্রাথমিক ক্রিয়াকলাপগুলি (চেহারা, সন্নিবেশ, মুছে ফেলা) সময় নেয় (গ্যারান্টিযুক্ত অ্যাসিপটোটিক আপার বাউন্ড) আরও স্পষ্টভাবে, গাছে একটি অ্যাক্সেস প্রায় তুলনা করে।ঠ ণ ছ 2 ( এন )O(lg(n))log2(n)
হ্যাশ টেবিলগুলি আরও কিছু পরিবর্তনশীল। তাদের জন্য প্রায় পয়েন্টারের অ্যারে প্রয়োজন require একটি উপাদান অ্যাক্সেস হ্যাশ ফাংশন মানের উপর নির্ভর করে। একটি হ্যাশ ফাংশনের উদ্দেশ্য উপাদানগুলি ছড়িয়ে দেওয়া। একটি হ্যাশ টেবিল "কাজ করে" যদি আপনি এটি সংরক্ষণ করতে চান এমন সমস্ত উপাদান আলাদা আলাদা হ্যাশ করে। যদি এটি হয়, তবে মৌলিক ক্রিয়াকলাপগুলি (চেহারা, সন্নিবেশ, মোছা) মোটামুটি ছোট ধ্রুবক (একটি হ্যাশ গণনা এবং একটি পয়েন্টার লুকআপ) সহ সময় নেয়। এটি অনেকগুলি সাধারণ ক্ষেত্রে হ্যাশ টেবিলগুলি খুব দ্রুত তৈরি করে।ও ( 1 )2nO(1)
হ্যাশ টেবিলগুলির সাথে একটি সাধারণ সমস্যা হ'ল জটিলতার নিশ্চয়তা নেই।O(1)
- অতিরিক্ত হিসাবে, একটি পয়েন্ট রয়েছে যেখানে টেবিলটি পূর্ণ হয়ে যায়; যখন এটি ঘটে (বা, আরও ভাল, তার কিছুটা আগে হওয়ার আগে), টেবিলটি বাড়ানো দরকার, যার জন্য ব্যয়ের জন্য তার সমস্ত উপাদান সরিয়ে নেওয়া প্রয়োজন । যখন প্রচুর উপাদান যুক্ত করা হয় তখন এটি "হতাশ" আচরণের পরিচয় দিতে পারে।O(n)
- ইনপুটটির পক্ষে কয়েকটি হ্যাশ মানগুলির মধ্যে সংঘর্ষ হওয়া সম্ভব। এটি খুব কমই প্রাকৃতিকভাবে ঘটে থাকে তবে আক্রমণকারী দ্বারা ইনপুটগুলি বেছে নেওয়া হলে এটি কোনও সুরক্ষা সমস্যা হতে পারে: এটি কিছু সার্ভারকে যথেষ্ট ধীর করার উপায় way এই ইস্যুটির ফলে কিছু প্রোগ্রামিং ভাষা বাস্তবায়ন হয়েছে (যেমন পার্ল এবং পাইথন) একটি সরল পুরাতন হ্যাশ টেবিল থেকে একটি হ্যাশ ফাংশনে সরিয়ে নিয়ে যায় যখন হ্যাশ টেবিলটি তৈরি করা হয় তখন একটি হ্যাশ ফাংশন মিলিয়ে একটি হ্যাশ ফাংশন সহ যা এই র্যান্ডম ডাটামকে ভালভাবে ছড়িয়ে দেয় together (যা ) বা বাইনারি অনুসন্ধান গাছে গুণক ধ্রুবক বাড়ায় । আপনি যখন কোনও ক্রিপ্টোগ্রাফিক হ্যাশ ব্যবহার করে সংঘর্ষগুলি এড়াতে পারবেন, এটি বাস্তবে করা হয় না কারণ ক্রিপ্টোগ্রাফিক হ্যাশগুলি তুলনামূলকভাবে গণনা করতে খুব ধীর হয়।O(1)
আপনি যখন মিশ্রণে ডেটা লোকালটি নিক্ষেপ করেন তখন হ্যাশ টেবিলগুলি খারাপভাবে কাজ করে। তারা যথাযথভাবে কাজ করে কারণ তারা সম্পর্কিত উপাদানগুলি দূরে সরিয়ে রাখে, এর অর্থ হল যদি অ্যাপ্লিকেশনটি ধারাবাহিকভাবে একটি উপসর্গ ভাগ করে এমন উপাদানগুলি দেখায় তবে এটি ক্যাশে প্রভাবগুলি থেকে উপকৃত হবে না। যদি অ্যাপ্লিকেশনটি মূলত এলোমেলোভাবে অনুসন্ধান করে তবে এটি প্রাসঙ্গিক নয়।
অনুসন্ধান গাছগুলির পক্ষে অন্য একটি বিষয় হ'ল এগুলি একটি অপরিবর্তনীয় ডেটা কাঠামো: আপনার যদি একটি গাছের একটি অনুলিপি নেওয়া দরকার এবং এতে কয়েকটি উপাদান পরিবর্তন করতে হয় তবে আপনি বেশিরভাগ ডেটা কাঠামো ভাগ করতে পারেন। আপনি যদি হ্যাশ টেবিলের একটি অনুলিপি নেন তবে আপনাকে পয়েন্টারগুলির পুরো অ্যারেটি অনুলিপি করতে হবে। এছাড়াও, আপনি যদি খাঁটি কার্যকরী ভাষাগুলিতে কাজ করেন তবে হ্যাশ টেবিলগুলি প্রায়শই কোনও বিকল্প নয়।
আপনি যখন স্ট্রিং ছাড়িয়ে যান, হ্যাশ টেবিলগুলি এবং বাইনারি অনুসন্ধানের গাছগুলি কী এর ডেটা টাইপের জন্য বিভিন্ন প্রয়োজনীয়তা তৈরি করে: হ্যাশ টেবিলগুলিতে একটি হ্যাশ ফাংশন প্রয়োজন (কীগুলি থেকে পূর্ণসংখ্যার কীগুলি থেকে কোনও ফাংশন যেমন , বাইনারি অনুসন্ধানের গাছগুলিতে মোট অর্ডার প্রয়োজন। হ্যাশগুলি কখনও কখনও ক্যাশে করা যায়, যদি ডেটা কাঠামোতে কীটি সঞ্চিত থাকে সেখানে পর্যাপ্ত জায়গা থাকে; তুলনা (একটি বাইনারি অপারেশন) এর ফলাফলটি ক্যাচ করা প্রায়শই অবৈধ। অন্যদিকে, তুলনা শর্টকাট থেকে উপকার পেতে পারে: যদি প্রথম কয়েক বাইটের মধ্যে কীগুলি প্রায়শই পৃথক হয় তবে একটি নেতিবাচক তুলনা খুব দ্রুত হতে পারে।k1≡k2⟹h(k1)=h(k2)
বিশেষত, যদি আপনি কীগুলিতে ক্রম প্রয়োজন হয় , উদাহরণস্বরূপ যদি আপনি চাবিগুলি বর্ণানুক্রমিক ক্রমে তালিকাবদ্ধ করতে সক্ষম করতে চান তবে হ্যাশ টেবিলগুলি কোনও সহায়তা নয় (আপনার সেগুলি সাজানোর প্রয়োজন হবে), আপনি যেখানে ক্রমানুসারে কোনও অনুসন্ধান গাছকে সোজাভাবে ট্র্যাভার করতে পারে।
আপনি হ্যাশ ট্রি আকারে বাইনারি অনুসন্ধান গাছ এবং হ্যাশ টেবিল একত্রিত করতে পারেন । একটি হ্যাশ ট্রি তাদের হ্যাশ অনুসারে অনুসন্ধানের গাছগুলিতে কীগুলি সঞ্চয় করে। এটি দরকারী, উদাহরণস্বরূপ, একটি নিখুঁত কার্যকরী প্রোগ্রামিং ভাষায় যেখানে আপনি এমন ডেটাতে কাজ করতে চান যেখানে সহজেই গণনা করার আদেশের সম্পর্ক নেই।
কীগুলি যখন স্ট্রিং হয় (বা পূর্ণসংখ্যা), তখন ট্রাই অন্য বিকল্প হতে পারে। ট্রাই একটি গাছ, তবে অনুসন্ধান গাছের থেকে আলাদাভাবে সূচিযুক্ত: আপনি বাইনারিটিতে কীটি লিখেন এবং 0 এর জন্য বাম দিকে যান এবং 1 এর জন্য ডানদিকে যান an অ্যাক্সেসের ব্যয়টি কীটির দৈর্ঘ্যের সাথে সমানুপাতিক। মধ্যবর্তী নোডগুলি অপসারণ করার জন্য চেষ্টাগুলি সংকুচিত করা যেতে পারে; এটি প্যাট্রিসিয়া ট্রি বা রেডিক্স ট্রি হিসাবে পরিচিত । মূলা গাছগুলি সুষম গাছগুলিকে ছাড়িয়ে যায়, বিশেষত যখন অনেকগুলি কী একটি সাধারণ উপসর্গ ভাগ করে।