হ্যাশ টেবিলের উপর বাইনারি অনুসন্ধান গাছগুলির সুবিধা কী কী?
হ্যাশ টেবিলগুলি থেটা (1) সময়ে যে কোনও উপাদান সন্ধান করতে পারে এবং এটি কোনও উপাদান যুক্ত করা ঠিক তত সহজ .... তবে আমি অন্যান্য উপায়ের সুবিধার বিষয়ে নিশ্চিত নই।
হ্যাশ টেবিলের উপর বাইনারি অনুসন্ধান গাছগুলির সুবিধা কী কী?
হ্যাশ টেবিলগুলি থেটা (1) সময়ে যে কোনও উপাদান সন্ধান করতে পারে এবং এটি কোনও উপাদান যুক্ত করা ঠিক তত সহজ .... তবে আমি অন্যান্য উপায়ের সুবিধার বিষয়ে নিশ্চিত নই।
উত্তর:
মনে রাখবেন বাইনারি অনুসন্ধান গাছগুলি (রেফারেন্স-ভিত্তিক) মেমরি-দক্ষ। তারা তাদের চেয়ে বেশি মেমরি সংরক্ষণ করে না।
উদাহরণস্বরূপ, যদি একটি হ্যাশ ফাংশনটির একটি পরিসীমা থাকে R(h) = 0...100
তবে আপনাকে কেবলমাত্র 20 টি উপাদান হ্যাশ করলেও আপনাকে 100 টি অ্যারের (পয়েন্টার-টু) উপাদান বরাদ্দ করতে হবে। আপনি যদি একই তথ্য সংরক্ষণের জন্য বাইনারি অনুসন্ধানের গাছ ব্যবহার করেন তবে আপনি কেবলমাত্র আপনার প্রয়োজনীয় পরিমাণ স্থান বরাদ্দ করবেন পাশাপাশি লিঙ্কগুলি সম্পর্কে কিছু মেটাডেটা।
একটি সুবিধা যা অন্য কেউ উল্লেখ করেনি তা হ'ল বাইনারি অনুসন্ধান ট্রি আপনাকে দক্ষতার সাথে পরিসীমা অনুসন্ধান করতে দেয়।
আমার ধারণাটি চিত্রিত করার জন্য, আমি একটি চরম মামলা করতে চাই। বলুন যে আপনি সমস্ত এলিমেন্টগুলি পেতে চান যাদের কীগুলি 0 থেকে 5000 এর মধ্যে রয়েছে actually এবং প্রকৃতপক্ষে কেবলমাত্র এই জাতীয় উপাদান রয়েছে এবং অন্যান্য 10000 উপাদান রয়েছে যার কীগুলি সীমার মধ্যে নেই। বিএসটি কার্যকরভাবে পরিসীমা অনুসন্ধান করতে পারে যেহেতু এটি কোনও সাবট্রি অনুসন্ধান করে না যার উত্তর পাওয়া অসম্ভব।
যখন আপনি কীভাবে একটি হ্যাশ টেবিলের মধ্যে পরিসীমা অনুসন্ধান করতে পারেন? হয় আপনার প্রতিটি বালতি স্থান পুনরাবৃত্তি করতে হবে যা ও (এন), বা আপনার 1,2,3,4 ... 5000 অবধি প্রতিটি বিদ্যমান আছে কিনা তা আপনাকে খুঁজে বার করতে হবে। (0 থেকে 5000 এর মধ্যে কীগুলি অসীম সেট? উদাহরণস্বরূপ কীগুলি দশমিক হতে পারে)
বাইনারি গাছের একটি "সুবিধা" হ'ল এটি সমস্ত উপাদানগুলিকে ক্রমানুসারে তালিকাভুক্ত করার জন্য ট্র্যাভ্রেস করা যেতে পারে। এটি হ্যাশ টেবিলের সাহায্যে অসম্ভব নয় তবে হ্যাশ স্ট্রাকচারের মধ্যে একটি নকশা করা সাধারণ ক্রিয়াকলাপ নয়।
অন্যান্য সমস্ত ভাল মন্তব্য ছাড়াও:
সাধারণত হ্যাশ টেবিলগুলিতে বাইনারি গাছের তুলনায় কম মেমরি পড়ার জন্য আরও ভাল ক্যাশে আচরণ করা হয়। একটি হ্যাশ টেবিলের জন্য আপনি কেবলমাত্র আপনার ডেটা ধরে থাকা কোনও রেফারেন্সে অ্যাক্সেস পাওয়ার আগে কেবল একক পঠন করতে পারেন। বাইনারি ট্রি, যদি এটি একটি ভারসাম্যপূর্ণ বৈকল্পিক হয় তবে কিছু * ধ্রুবক কে এর জন্য কে * এলজি (এন) মেমরি পড়ার ক্রমে কিছু দরকার something
অন্যদিকে, কোনও শত্রু যদি আপনার হ্যাশ-ফাংশন জানেন তবে শত্রু সংঘর্ষগুলি তৈরি করতে আপনার হ্যাশ টেবিলটি কার্যকর করতে পারে, এর কার্যকারিতা ব্যাপকভাবে বাধাগ্রস্থ করে। কাজটি হ'ল হ্যাশ-ফাংশনটি এলোমেলোভাবে একটি পরিবার থেকে বেছে নেওয়া, তবে একটি বিএসটি এর অসুবিধা নেই। এছাড়াও, যখন হ্যাশ টেবিলের চাপ খুব বেশি বেড়ে যায়, আপনি প্রায়শই হ্যাশ টেবিলটি প্রসারিত এবং পুনর্বিবেচনা করেন যা একটি ব্যয়বহুল অপারেশন হতে পারে। বিএসটির এখানে সরল আচরণ রয়েছে এবং হঠাৎ করে প্রচুর ডেটা বরাদ্দ করা এবং পুনর্নির্মাণ অপারেশন করার ঝোঁক থাকে না।
গাছগুলি চূড়ান্ত গড় ডেটা স্ট্রাকচার হতে থাকে। তারা তালিকা হিসাবে কাজ করতে পারে, সমান্তরাল ক্রিয়াকলাপের জন্য সহজেই বিভক্ত হতে পারে, ও (এলজি এন) এর ক্রমটিতে দ্রুত অপসারণ, সন্নিবেশ এবং সন্ধান করতে পারে । তারা বিশেষত ভাল কিছু করে না , তবে তাদের কোনও অতিরিক্ত খারাপ আচরণও হয় না।
অবশেষে, BSTs অনেক (খাঁটি) হ্যাশ-টেবিল তুলনায় কার্মিক ভাষায় বাস্তবায়ন সহজ হয় এবং তারা ধ্বংসাত্মক আপডেট বাস্তবায়ন হবে (প্রয়োজন বোধ করেন না অধ্যবসায় পাসকাল দ্বারা যুক্তি উপরে)।
BSTs are much easier to implement in (pure) functional languages compared to hash-tables
- সত্যি? আমি এখন একটি কার্যকরী ভাষা শিখতে চাই!
একটি হ্যাশ টেবিলের উপর বাইনারি গাছের প্রধান সুবিধা হ'ল বাইনারি ট্রি আপনাকে দুটি অতিরিক্ত ক্রিয়াকলাপ দেয় যা আপনি করতে পারবেন না (সহজে, দ্রুত) একটি হ্যাশ টেবিল দিয়ে
কিছু স্বেচ্ছাসেবক মূল্যের মান (বা উপরে / নীচে নিকটতম) এর নিকটতম (প্রয়োজনীয় সমান নয়) সন্ধান করুন
সাজানো ক্রমে গাছের বিষয়বস্তুগুলি দিয়ে পুনরাবৃত্তি করুন
দুটি সংযুক্ত - বাইনারি ট্রি তার সামগ্রীগুলি বাছাই করা ক্রমে রাখে, সুতরাং যে জিনিসগুলির জন্য বাছাই করা ক্রমের প্রয়োজন হয় তা করা সহজ।
একটি (ভারসাম্যযুক্ত) বাইনারি অনুসন্ধান গাছেরও সুবিধা রয়েছে যে এর অ্যাসিপটোটিক জটিলতাটি আসলে একটি উচ্চতর গণ্ডি, যখন হ্যাশ টেবিলগুলির জন্য "ধ্রুবক" সময়গুলি অনুশীলনের সময় হয়: যদি আপনার কোনও অনুপযুক্ত হ্যাশ ফাংশন থাকে, আপনি লিনিয়ার সময়কে অবনতি করতে পারেন পরিবর্তে ধ্রুবক।
প্রথমবার তৈরি হওয়ার পরে একটি হ্যাশটেবল আরও স্থান নিতে পারে - এটিতে যে উপাদানগুলি সন্নিবেশ করা হয়নি তার জন্য এটি স্লট উপলব্ধ থাকবে (তারা কখনও সন্নিবেশ করানো হয়েছে কি না), বাইনারি অনুসন্ধানের গাছটি কেবল ততটাই বড় হবে যেমন এটি প্রয়োজন থাকা. এছাড়াও, যখন একটি হ্যাশ-টেবিলের আরও ঘর প্রয়োজন, অন্য কাঠামোতে প্রসারিত করা সময় সাপেক্ষ হতে পারে, তবে এটি বাস্তবায়নের উপর নির্ভর করে।
একটি বাইনারি অনুসন্ধান গাছ একটি ধ্রুবক ইন্টারফেস সহ প্রয়োগ করা যেতে পারে , যেখানে নতুন গাছ ফিরে এসেছে তবে পুরানো গাছের অস্তিত্ব অবিরত রয়েছে। সাবধানে প্রয়োগ করা হয়েছে, পুরানো এবং নতুন গাছগুলি তাদের নোডের বেশিরভাগ ভাগ করে। আপনি স্ট্যান্ডার্ড হ্যাশ টেবিল দিয়ে এটি করতে পারবেন না।
একটি বাইনারি গাছ অনুসন্ধান এবং intoোকানোর জন্য ধীরে ধীরে, তবে ইনফিক্স ট্র্যাভারসালটির খুব সুন্দর বৈশিষ্ট্য রয়েছে যার মূল অর্থ হ'ল আপনি একটি সাজানো ক্রমে গাছের নোড দিয়ে পুনরাবৃত্তি করতে পারেন।
একটি হ্যাশ টেবিলের এন্ট্রিগুলির মাধ্যমে আইট্রেট করা খুব বেশি অর্থবোধ করে না কারণ এগুলি সমস্ত স্মৃতিতে ছড়িয়ে আছে।
কোডিং সাক্ষাত্কার ক্র্যাকিং থেকে , 6th ষ্ঠ সংস্করণ
ভারসাম্য বাইনারি অনুসন্ধান ট্রি (বিএসটি) দিয়ে আমরা হ্যাশ টেবিলটি প্রয়োগ করতে পারি। এটি আমাদের একটি ও (লগ এন) দেখার সময় দেয়। এর সুবিধাটি সম্ভাব্যভাবে কম স্থান ব্যবহার করা হয়, যেহেতু আমরা আর বড় অ্যারে বরাদ্দ করি না। আমরা কীগুলি ক্রমে পুনরাবৃত্তি করতে পারি যা কখনও কখনও কার্যকর হতে পারে।
বিএসটিগুলি ও (লগন) সময়ে "ফাইন্ডপ্রাইডেসর" এবং "ফাইন্ডসুকসেসর" ক্রিয়াকলাপগুলি (পরবর্তী ছোট এবং পরবর্তী বৃহত্তম উপাদানগুলি সন্ধান করতে) সরবরাহ করে যা খুব কার্যকর অপারেশনও হতে পারে। হ্যাশ টেবিল সেই সময়ের দক্ষতা সরবরাহ করতে পারে না।
আপনি যদি বাছাই করা উপায়ে ডেটা অ্যাক্সেস করতে চান তবে হ্যাশ টেবিলের সমান্তরালে একটি বাছাই করা তালিকা বজায় রাখতে হবে। একটি ভাল উদাহরণ। নেট মধ্যে অভিধান। ( http://msdn.microsoft.com/en-us/library/3fcwy8h6.aspx দেখুন )।
এটি কেবল ধীরে ধীরে প্রবেশের পার্শ্ব-প্রতিক্রিয়া রাখে না, তবে এটি একটি বি-ট্রি-এর চেয়ে বেশি পরিমাণে মেমরি গ্রহণ করে।
আরও, যেহেতু একটি খ-গাছ সাজানো হয়েছে, ফলাফলের ব্যাপ্তিগুলি খুঁজে পাওয়া বা ইউনিয়নগুলি বা সংহতকরণ করা সহজ।
এটি ব্যবহারের উপরও নির্ভর করে, হ্যাশ সঠিক ম্যাচটি সনাক্ত করতে দেয়। আপনি যদি কোনও ব্যাপ্তির জন্য জিজ্ঞাসা করতে চান তবে বিএসটিই পছন্দ। ধরুন আপনার কাছে প্রচুর ডেটা e1, e2, e3 ..... en আছে।
হ্যাশ টেবিলের সাহায্যে আপনি স্থির সময়ে যে কোনও উপাদান সনাক্ত করতে পারেন।
আপনি যদি e41 এর চেয়ে বড় এবং e8 এর চেয়ে কম রেঞ্জের মানগুলি খুঁজে পেতে চান তবে BST দ্রুত তা সন্ধান করতে পারে।
মূল বিষয় হ'ল ফাংশন যা কোনও সংঘর্ষ এড়ানোর জন্য ব্যবহৃত হয়। অবশ্যই, আমরা সম্পূর্ণরূপে কোনও সংঘর্ষ এড়াতে পারি না, সেক্ষেত্রে আমরা শৃঙ্খলাকৃতি বা অন্যান্য পদ্ধতি অবলম্বন করি। এটি সবচেয়ে খারাপ ক্ষেত্রে পুনরুদ্ধার আর স্থির সময় করে না।
একবার পূর্ণ হয়ে গেলে, হ্যাশ টেবিলটিকে তার বালতির আকার বাড়াতে হবে এবং সমস্ত উপাদানগুলির মধ্যে আবার অনুলিপি করতে হবে। এটি একটি অতিরিক্ত ব্যয় যা বিএসটি-তে উপস্থাপিত হয় না।
হ্যাশ টেবিলগুলি সূচকের জন্য ভাল নয়। আপনি যখন কোনও ব্যাপ্তি অনুসন্ধান করছেন, তখন বিএসটিগুলি আরও ভাল। এ কারণেই বেশিরভাগ ডাটাবেস সূচকগুলি হ্যাশ টেবিলের পরিবর্তে বি + গাছ ব্যবহার করে
বাইনারি অনুসন্ধান গাছগুলি অভিধান প্রয়োগ করতে ভাল পছন্দ যদি কীগুলিতে কিছু মোট অর্ডার (কীগুলি তুলনাযোগ্য হয়) থাকে এবং আপনি আদেশের তথ্য সংরক্ষণ করতে চান।
বিএসটি আদেশের তথ্য সংরক্ষণ করে, এটি আপনাকে চারটি অতিরিক্ত গতিশীল সেট অপারেশন সরবরাহ করে যা হ্যাশ টেবিলগুলি ব্যবহার করে (দক্ষতার সাথে) সম্পাদন করা যায় না। এই অপারেশনগুলি হ'ল:
প্রতিটি বিএসটি অপারেশনের মতো এই সমস্ত অপারেশনে ও (এইচ) এর জটিল জটিলতা রয়েছে। অতিরিক্তভাবে সমস্ত সঞ্চিত কীগুলি বিএসটি-তে সজ্জিত থাকে যাতে কেবল ক্রম অনুযায়ী গাছটিকে অনুসরণ করে কীগুলির সাজানো ক্রম পেতে আপনাকে সক্ষম করে।
সংক্ষেপে আপনি যদি চান সমস্ত অপারেশন সন্নিবেশ করান, মুছুন এবং মুছুন তবে হ্যাশ টেবিলটি পারফরম্যান্সে অপরাজেয় (বেশিরভাগ সময়) is তবে আপনি যদি উপরে তালিকাভুক্ত কোনও বা সমস্ত অপারেশন চান আপনার একটি বিএসটি ব্যবহার করা উচিত, বিশেষত একটি স্ব-ব্যালেন্সিং বিএসটি।
হ্যাশ টেবিলের প্রধান সুবিধা হ'ল এটি all = O (1) এ প্রায় সমস্ত অপ্স করে। এবং এটি বোঝা এবং বাস্তবায়ন করা খুব সহজ। এটি দক্ষতার সাথে অনেকগুলি "সাক্ষাত্কারের সমস্যাগুলি" সমাধান করে। সুতরাং আপনি যদি কোনও কোডিং সাক্ষাত্কার ক্র্যাক করতে চান তবে হ্যাশ টেবিলের সাথে সেরা বন্ধু তৈরি করুন ;-)
একটি হ্যাশম্যাপ হ'ল একটি সেট অ্যাসোসিয়েটিভ অ্যারে। সুতরাং, আপনার ইনপুট মানগুলির অ্যারেটি বালতিগুলিতে বিদ্ধ হয়। একটি খোলা সম্বোধনের স্কিমে, আপনার একটি বালতিতে একটি পয়েন্টার রয়েছে এবং প্রতিবার যখন আপনি বালতিতে একটি নতুন মান যুক্ত করেন, আপনি বালতিতে কোথায় ফাঁকা জায়গা রয়েছে তা খুঁজে বের করতে পারেন। এটি করার কয়েকটি উপায় রয়েছে- আপনি বালতিটির শুরুতে শুরু করেন এবং প্রতিবার পয়েন্টারটি বৃদ্ধি করেন এবং পরীক্ষা করেন যে এটি দখল রয়েছে কিনা। একে লিনিয়ার প্রোবিং বলা হয়। তারপরে, আপনি অ্যাডের মতো বাইনারি অনুসন্ধান করতে পারেন, যেখানে আপনি বালতি শুরুর মধ্যবর্তী পার্থক্য দ্বিগুণ করেন এবং প্রতিবার কোনও ফাঁকা জায়গার সন্ধানের সময় আপনি দ্বিগুণ বা পিছনে নেমে যান। একে বলা হয় চতুষ্কোণ প্রবেগ। ঠিক আছে. এখন এই দুটি পদ্ধতির সমস্যা হ'ল যদি বালতিটি পরের বালতি ঠিকানার মধ্যে প্রবাহিত হয়, তবে আপনাকে নিম্নলিখিতগুলি করতে হবে-
ঠিক আছে. তবে আপনি যদি কোনও লিঙ্কলিস্ট ব্যবহার করেন তবে ঠিক এমন সমস্যা হওয়া উচিত নয়? হ্যাঁ, লিঙ্কযুক্ত তালিকায় আপনার এই সমস্যা নেই this প্রতিটি বালতি একটি লিঙ্কযুক্ত তালিকার সাথে শুরু করার কথা বিবেচনা করে, এবং যদি আপনার বালতিতে 100 টি উপাদান থাকে তবে আপনাকে লিঙ্কযুক্ত তালিকার শেষের দিকে পৌঁছানোর জন্য 100 টি উপাদানকে অতিক্রম করতে হবে তাই তালিকা.এডডি (এলিমেন্ট ই) থেকে সময় লাগবে -
লিঙ্কযুক্ত তালিকা বাস্তবায়নের সুবিধা হ'ল খোলা সম্বোধনের বাস্তবায়নের ক্ষেত্রে আপনার মেমরি বরাদ্দকরণ ক্রিয়াকলাপ এবং সমস্ত বালতিগুলির ও (এন) স্থানান্তর / অনুলিপিের দরকার নেই।
সুতরাং, ও (এন) অপারেশন হ্রাস করার উপায় হ'ল অপারেশনগুলি ও (লগ (এন)) খুঁজে পাওয়া বাইনারি অনুসন্ধানের ট্রিটিতে প্রয়োগকরণকে রূপান্তর করা এবং আপনি তার মানটির উপর ভিত্তি করে উপাদানটিকে তার অবস্থানে যুক্ত করুন। একটি বিএসটি-র যুক্ত বৈশিষ্ট্যটি এটি সাজানো আসে!
স্ট্রিং কীগুলির সাহায্যে বাইনারি অনুসন্ধান গাছগুলি দ্রুততর হতে পারে। বিশেষত যখন স্ট্রিংগুলি দীর্ঘ হয়।
বাইনারি অনুসন্ধান গাছগুলি কম / বৃহত্তর জন্য তুলনা ব্যবহার করে যা স্ট্রিংগুলির জন্য দ্রুত (যখন তারা সমান নয়)। সুতরাং কোনও স্ট্রিং পাওয়া না গেলে একটি বিএসটি দ্রুত উত্তর দিতে পারে। এটি পাওয়া গেলে এটির জন্য কেবল একটি সম্পূর্ণ তুলনা করা দরকার।
একটি হ্যাশ টেবিল। আপনাকে স্ট্রিংয়ের হ্যাশ গণনা করতে হবে এবং এর অর্থ হ্যাশ গণনা করার জন্য আপনাকে কমপক্ষে একবারে সমস্ত বাইট অতিক্রম করতে হবে। তারপরে আবার যখন কোনও ম্যাচিং এন্ট্রি পাওয়া যায়।