আরবি ট্রি, বি-ট্রি বা এভিএল ট্রি কখন নির্বাচন করবেন?


88

প্রোগ্রামার হিসাবে কখন আমার আরবি ট্রি, বি-ট্রি বা একটি এভিএল ট্রি ব্যবহার করা উচিত? পছন্দের সিদ্ধান্ত নেওয়ার আগে কী কী মূল বিষয়গুলি বিবেচনা করা দরকার?

কেউ দয়া করে প্রতিটি গাছের কাঠামোর জন্য একটি দৃশ্যের সাহায্যে ব্যাখ্যা করতে পারেন কেন মূল পয়েন্টগুলির সাথে অন্যের তুলনায় এটি বেছে নেওয়া হয়?


10
ভাল, আমি এই প্রশ্নের প্রশংসা করি - বর্তমানে ফাস্টুটিল ইনটএভিএলটি ট্রিসেট বনাম ইন্টআরবিট্রিসেটের একটি পছন্দ উপস্থাপন করেছি।
ইয়াং

উত্তর:


115

এক চিমটি লবণের সাথে এটি নিন:

বি-ট্রি যখন আপনি কয়েক হাজারেরও বেশি আইটেম পরিচালনা করছেন এবং আপনি সেগুলি কোনও ডিস্ক বা কিছু ধীর স্টোরেজ মাধ্যম থেকে প্যাজ করছেন।

আরবি ট্রি যখন আপনি গাছে মোটামুটি ঘন ঘন সন্নিবেশ, মুছুন এবং পুনরুদ্ধার করছেন।

আপনার সন্নিবেশ এবং মুছে ফেলা আপনার পুনরুদ্ধারের তুলনায় বিরল সম্পর্কিত যখন AVL ট্রি।


34
আরও কিছু বিশদ যুক্ত করতে: বি-গাছে বিভিন্ন ধরণের বাচ্চা থাকতে পারে যা এটিকে অনেক রেকর্ড ধারণ করতে দেয় তবে তবুও একটি ছোট উচ্চতার গাছ বজায় রাখে। আরবি ট্রিটিতে পুনরায় ভারসাম্যের চারপাশে কম কঠোর নিয়ম রয়েছে যা এভিএল গাছের চেয়ে দ্রুত সন্নিবেশ / মুছা তৈরি করে। বিপরীতে, AVL গাছ আরও কঠোরভাবে ভারসাম্যযুক্ত তাই আরবি গাছের চেয়ে লকআপগুলি দ্রুত হয় are
pschang

আরবি গাছগুলির পুনরায় ভারসাম্য রক্ষার জন্য আরও ভাল পারফরম্যান্স ও (1) থাকে যা এগুলি রোল-ব্যাক এবং রোল-ফরোয়ার্ড সহ ধ্রুবক ডেটাস্ট্রাকচারের জন্য আরও উপযুক্ত করে তোলে।

20

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

বি + গাছগুলির সমস্যা আছে, যেমন - নোডের মধ্যে আইটেমগুলি ঘুরে যখন আপনি সন্নিবেশ / মুছুন, আইটেমগুলিতে অকার্যকর পয়েন্টার করুন। আমার কাছে একটি ধারক লাইব্রেরি রয়েছে যা "কার্সার রক্ষণাবেক্ষণ" করে - কার্সারগুলি লিফ নোডের সাথে তাদের সংযুক্ত করে তারা বর্তমানে লিঙ্কযুক্ত তালিকায় উল্লেখ করেছে, যাতে সেগুলি স্বয়ংক্রিয়ভাবে স্থির বা অবৈধ হতে পারে। যেহেতু এক বা দু'টি কার্সারের সাথে খুব কমই দেখা যায় তাই এটি ভালভাবে কাজ করে - তবে এটি সমস্ত অতিরিক্ত একই কাজ।

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

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

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

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



0

ডেটা স্ট্রাকচার বেছে নেওয়ার সময় আপনি যেমন ফ্যাক্টরগুলি ট্রেড করছেন

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

আমি রবার্ট হার্ভে উল্লেখ করা উইকিপিডিয়া নিবন্ধগুলি পড়তে শুরু করব।

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


4
সুষ্ঠু হতে, ওপি জিজ্ঞাসা when should I consider using, না when should I consider implementing। সর্বশেষ অনুচ্ছেদটি সত্য হলেও এটি এই প্রশ্নের প্রসঙ্গে খুব বেশি মূল্য সরবরাহ করে না। এমনকি লাইব্রেরি সহ, আপনার কাঠামোগত প্রয়োজনীয়তার জন্য কোন কাঠামোটি সর্বোত্তমভাবে উপযুক্ত তা কার্যকরভাবে চয়ন করতে আপনাকে অ্যালগরিদমগুলি বুঝতে হবে।
ড্যান বেচার্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.