লাল-কালো গাছ এত জনপ্রিয় কেন?


46

দেখে মনে হচ্ছে যে যেখানেই আমি দেখি, ডেটা স্ট্রাকচারগুলি লাল-কালো গাছ ব্যবহার করে প্রয়োগ করা হচ্ছে ( std::setসি ++ তে, SortedDictionaryসি # তে, ইত্যাদি))

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

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

অনলাইনে অনেক মানদণ্ড রয়েছে যা এভিএল এবং লাল-কালো গাছের তুলনা করে তবে আমার প্রফেসরটি মূলত বলেছিলেন যে, আপনি সাধারণত দুটি জিনিসের মধ্যে একটি করেন:

  • হয় আপনি কর্মক্ষমতা সম্পর্কে সত্যই তেমন যত্ন নেন না, সেক্ষেত্রে বেশিরভাগ ক্ষেত্রে এভিএল বনাম রেড-ব্ল্যাকের 10-20% পার্থক্য মোটেই গুরুত্বপূর্ণ নয়।
  • বা আপনি প্রকৃতপক্ষে পারফরম্যান্সের বিষয়ে যত্নশীল হন, আপনি যদি এভিএল এবং লাল-কালো উভয় গাছই খনন করেন এবং বি-গাছের সাথে যান, যা আরও ভাল (বা (ক, খ) -তারা, আমি ' আমি সবাইকে একটি ঝুড়িতে রাখব।)

এর কারণ হ'ল কারণ একটি বি-ট্রি মেমরিতে আরও সংক্ষিপ্তভাবে ডেটা সঞ্চয় করে (একটি নোডে অনেকগুলি মান রয়েছে) খুব কম ক্যাশে মিস হবে। আপনি ব্যবহারের কেসের উপর ভিত্তি করে বাস্তবায়নটিকেও ঝাপিয়ে রাখতে পারেন এবং সি-পি-কে ক্যাশের আকারের উপর নির্ভর করে বি-গাছের ক্রমকে তৈরি করতে পারেন etc.

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

এটিই বলা হচ্ছে, লাল-কালো গাছগুলি সর্বত্র ব্যবহৃত হওয়ার কোনও বিশেষ কারণ আছে, যখন উপরের কথার ভিত্তিতে বলা হয়েছে, বি-গাছগুলি সেগুলি ছাড়িয়ে যায়? (একমাত্র বেঞ্চমার্ক হিসাবে আমি খুঁজে পেতে পারি http://lh3lh3.users.sourceforge.net/udb.shtml , তবে এটি কেবল নির্দিষ্ট প্রয়োগের বিষয় হতে পারে) of বা লাল-কালো গাছ ব্যবহার করার কারণেই কি এগুলি কার্যকর করা সহজ নয়, বা বিভিন্ন কথায় এটি ব্যবহার করা শক্ত, খারাপভাবে প্রয়োগ করা কঠিন?

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


8
আপনার ব্যথা যুক্ত করতে, বিভিন্ন ধরণের অনুসন্ধান গাছের তুলনায় বেশিরভাগ নিবন্ধগুলি সম্পাদন করে ... আদর্শ পরীক্ষার চেয়ে কম।
রাফায়েল

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

3
স্ট্যাকওভারফ্লোতে আমাদের বন্ধুদের দ্বারা প্রাসঙ্গিক আলোচনা কেন std :: মানচিত্র একটি লাল-কালো গাছ হিসাবে প্রয়োগ করা হয়?
হেনড্রিক জানুয়ারী

উত্তর:


10

থেকে উদ্ধৃত করা উত্তর "থেকে AVL গাছ ও লাল, কালো গাছ শিকড় থেকে Traversals প্রশ্ন"

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

সুতরাং একটি রেডব্ল্যাক ট্রি সন্নিবেশ পুনরাবৃত্তি ছাড়াই প্রয়োগ করা যেতে পারে, কিছু সিপিইউতে পুনরাবৃত্তি খুব ব্যয়বহুল যদি আপনি ফাংশন কল ক্যাশে ওভাররন করেন (যেমন স্পার্কের কারণে রেজিস্টার উইন্ডো ব্যবহারের কারণে )

(আমি একটি ফাংশন কল সরিয়ে স্পার্কে 10 বারেরও বেশি দ্রুত সফটওয়্যারটি দেখেছি, যার ফলে প্রায়শই বলা একটি কোড পাথরটি নিবন্ধকের উইন্ডোর জন্য খুব গভীর ছিল you আপনি জানেন না যে রেজিস্টার উইন্ডোটি কত গভীর হবে আপনার গ্রাহকের সিস্টেম এবং আপনি জানেন না যে "হট কোড পাথ" এ আপনি কল স্ট্যাকের কতটা নিচে আছেন, পুনরাবৃত্তিটি আরও অনুমানের মতো তৈরি করে না))

এছাড়াও স্ট্যাকের বাইরে চলে যাওয়ার ঝুঁকি না রাখাই একটি সুবিধা।


তবে 2 ^ 32 নোড সহ একটি ভারসাম্য গাছের জন্য প্রায় 32 স্তরের পুনরাবৃত্তি প্রয়োজন হবে না। এমনকি যদি আপনার স্ট্যাক ফ্রেমটি 64 বাইট হয় তবে এটি 2 কেবি স্ট্যাকের বেশি নয়। এটা কি সত্যিই কোনও পার্থক্য করতে পারে? আমি এটা সন্দেহ হবে।
বিজন লিন্ডকভিস্ট

@ জর্জান লিন্ডকভিস্ট, ১৯৯০ এর দশকে স্পার্ক প্রসেসরে আমি প্রায় often থেকে of স্ট্যাকের গভীরতার থেকে একটি সাধারণ কোডের পাথ পরিবর্তন করে 10 গুণ বেশি গতি অর্জন করতাম! এটি কীভাবে ফাইলগুলি নিবন্ধভুক্ত করেছে তা পড়ুন ....
ইয়ান রিংরোজ

9

আমি সম্প্রতি এই বিষয়টিও গবেষণা করে চলেছি, সুতরাং এখানে আমার অনুসন্ধানগুলি রয়েছে, তবে মনে রাখবেন যে আমি ডেটা কাঠামোতে বিশেষজ্ঞ নই!

এমন কিছু ঘটনা রয়েছে যেখানে আপনি বি-ট্রি ব্যবহার করতে পারবেন না।

একটি শীর্ষস্থানীয় কেস std::mapসি ++ এসটিএল থেকে। স্ট্যান্ডার্ডটির জন্য এটি insertবিদ্যমান পুনরাবৃত্তিকারীদের অকার্যকর করে না requires

কোনও পুনরুক্তি বা রেফারেন্স অবৈধ হয় না।

http://en.cppreference.com/w/cpp/container/map/insert

এটি বি-ট্রিটিকে একটি বাস্তবায়ন হিসাবে বাতিল করে দেয় কারণ সন্নিবেশ বিদ্যমান উপাদানগুলির চারপাশে স্থানান্তরিত করে।

অনুরূপ অন্য ব্যবহারের ক্ষেত্রে হস্তক্ষেপমূলক ডেটাস্ট্রাকচার। এটি হ'ল গাছের নোডের মধ্যে আপনার ডেটা সংরক্ষণ করার পরিবর্তে, আপনি আপনার কাঠামোর ভিতরে বাচ্চাদের / পিতামাতার কাছে পয়েন্টারগুলি সঞ্চয় করেন:

// non intrusive
struct Node<T> {
    T value;
    Node<T> *left;
    Node<T> *right;
};
using WalrusList = Node<Walrus>;

// intrusive
struct Walrus {
    // Tree part
    Walrus *left;
    Walrus *right;

    // Object part
    int age;
    Food[4] stomach;
};

আপনি কেবল একটি বি-ট্রি ইন্ট্রিসিভ করতে পারবেন না, কারণ এটি কোনও পয়েন্টার-কেবল ডেটা কাঠামো নয়।

অন্তর্নিহিত লাল-কালো গাছ ব্যবহার করা হয়, উদাহরণস্বরূপ, জেমমলকে মেমরির বিনামূল্যে ব্লকগুলি পরিচালনা করতে। এটি লিনাক্স কার্নেলের একটি জনপ্রিয় ডেটা স্ট্রাকচারও।

আমি আরও বিশ্বাস করি যে "সিঙ্গল পাস টেল রিকভারসিভ" বাস্তবায়ন কোনও মিউটেটেবল ডেটা কাঠামো হিসাবে লাল কালো গাছের জনপ্রিয়তার কারণ নয়

প্রথমত, স্ট্যাকের গভীরতা এখানে অপ্রাসঙ্গিক, কারণ ( উচ্চতা দেওয়া) স্ট্যাক স্পেস শেষ হয়ে যাওয়ার আগে আপনি মূল স্মৃতি থেকে বেরিয়ে আসবেন। Jemalloc সঙ্গে খুশি preallocating স্ট্যাক সবচেয়ে খারাপ ক্ষেত্রে গভীরতা।logn

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

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

ওপেনডেস্ট্রাকচারে বর্ণিত বৈকল্পিকটি প্যারেন্ট পয়েন্টার, সন্নিবেশের জন্য একটি পুনরাবৃত্ত ডাউন ডাউন এবং ফিক্সআপগুলির জন্য পুনরাবৃত্ত লুপ আপ পাস ব্যবহার করে। পুনরাবৃত্তি কলগুলি একটি লেজ অবস্থান এবং সংকলকরা এটি একটি লুপে অনুকূলিত করে (আমি এটি মরিচায় পরীক্ষা করেছি)।

এটি হ'ল আপনি যদি প্যারেন্ট পয়েন্টার ব্যবহার করেন তবে কোনও লাল-কালো যাদু ছাড়াই একটি পরিবর্তনীয় অনুসন্ধান ট্রিটির একটি স্থির মেমরি লুপ প্রয়োগ করতে পারবেন। এটি বি-ট্রিগুলির জন্যও কাজ করে। আপনার একক পাসের লেজ পুনরাবৃত্তির অপরিবর্তনীয় বৈকল্পিকের জন্য যাদু দরকার এবং এটি যাইহোক ফিক্সআপটি ভেঙে দেবে ।O(1)


3

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

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

2) তাদের নোডের জন্য কেবল 1 বিট অতিরিক্ত তথ্য প্রয়োজন এবং আপনি প্রায়শই বিনামূল্যে এটি পাওয়ার কোনও উপায় খুঁজে পেতে পারেন find

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

4) যেভাবে লাল-কালো গাছটি 2-2 টি গাছের নোডকে আলাদা করে দেয় এবং মাঝের কীটি 2-2 নোডের মধ্যে কেবল পুনরুদ্ধার করে সন্নিবেশ করায় তা দুর্দান্ত মার্জিত। আমি শুধু এটি করতে ভালবাসি।


0

লাল-কালো বা এভিএল গাছগুলির বি-গাছগুলির তুলনায় একটি সুবিধা রয়েছে এবং কীটি দীর্ঘ হয় বা অন্য কোনও কারণে কীটি চালানো ব্যয়বহুল like

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


হাস্যকরভাবে, লাল-কালো গাছগুলি "ক" কেবলমাত্র (ক, খ) -র তিনটি ক্ষেত্রে, তাই বিষয়টি কি প্যারামিটারের টুইঙ্কে নেমে আসে বলে মনে হচ্ছে? (সিসি @ গিলস)
রাফেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.