Miklix

পিএইচপিতে বিচ্ছিন্ন সেট (ইউনিয়ন-ফাইন্ড অ্যালগরিদম)

প্রকাশিত: ১৬ ফেব্রুয়ারী, ২০২৫ এ ১২:২৯:০৮ PM UTC
সর্বশেষ আপডেট: ২৬ জানুয়ারী, ২০২৬ এ ১০:৩৭:০৫ AM UTC

এই নিবন্ধটিতে ডিসজয়েন্ট সেট ডেটা স্ট্রাকচারের একটি পিএইচপি বাস্তবায়ন রয়েছে, যা সাধারণত সর্বনিম্ন স্প্যানিং ট্রি অ্যালগরিদমে ইউনিয়ন-ফাইন্ডের জন্য ব্যবহৃত হয়।


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

Disjoint Set (Union-Find Algorithm) in PHP

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

  1. সন্ধান: কোনও উপাদান কোন সেটের অন্তর্গত তা নির্ধারণ করে।
  2. ইউনিয়ন: দুটি সেট একসাথে একত্রিত করে।

এই কাঠামোটি ক্রুসকালের অ্যালগরিদমের মতো ন্যূনতম স্প্যানিং ট্রি অ্যালগরিদমে বিশেষত দরকারী।

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

যাইহোক, এটি আমার ডিসজয়েন্ট সেটের পিএইচপি বাস্তবায়ন:

class DisjointSet
{
    private $parent = [];
    private $rank   = [];

    public function __construct($size)
    {
        for ($i = 0; $i < $size; $i++)
        {
            $this->parent[$i]   = $i;
            $this->rank[$i]     = 0;
        }
    }

    public function find($x)
    {
        if ($this->parent[$x] != $x)
        {
            $this->parent[$x] = $this->find($this->parent[$x]);
        }

        return $this->parent[$x];
    }

    public function union($x, $y)
    {
        $rootX = $this->find($x);
        $rootY = $this->find($y);

        if ($rootX != $rootY)
        {
            if ($this->rank[$rootX] > $this->rank[$rootY])
            {
                $this->parent[$rootY] = $rootX;
            }
            elseif ($this->rank[$rootX] < $this->rank[$rootY])
            {
                $this->parent[$rootX] = $rootY;
    
            }
            else
            {
                $this->parent[$rootY] = $rootX;
                $this->rank[$rootX]++;
            }
        }
    }
}

মজার জন্য গোলকধাঁধা তৈরি করা ছাড়াও, ডিসজয়েন্ট সেট ডেটা স্ট্রাকচারটি অবশ্যই বাস্তব জীবনের দৃশ্যের জন্যও ব্যবহার করা যেতে পারে।

উদাহরণস্বরূপ, একটি সামাজিক নেটওয়ার্ক কল্পনা করুন যা তার ব্যবহারকারীদের নতুন বন্ধুদের পরামর্শ দিতে চায় এবং তারপরে আসুন আমরা বলি যে আমাদের এই বন্ধু সম্পর্কের সাথে ছয় জন লোক ইতিমধ্যে রয়েছে:

  • 1 এবং 2 বন্ধু।
  • 2 এবং 3 বন্ধু।
  • 4 এবং 5 বন্ধু।
  • 6 এর কোন বন্ধু নেই।

এই পৃথক গ্রুপগুলিতে ইউনিয়ন-ফাইন্ড অ্যালগরিদম প্রয়োগ করে, আমাদের নিম্নলিখিতগুলি সন্ধান করা উচিত:

  • একটি গ্রুপে 1, 2 এবং 3।
  • দ্বিতীয় গ্রুপে 4 এবং 5।
  • তৃতীয় গ্রুপে 6।

এর উপর ভিত্তি করে, এটি পরামর্শ দেওয়া বোধগম্য হবে যে 1 এবং 3 এর বন্ধু হওয়া উচিত, কারণ তাদের মধ্যে ব্যক্তি 2 এর মিল রয়েছে।

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

ব্লুস্কাইতে শেয়ার করুনফেসবুকে শেয়ার করুনলিংকডইনে শেয়ার করুনটাম্বলারে শেয়ার করুনX-এ শেয়ার করুনলিংকডইনে শেয়ার করুনপিন্টারেস্টে পিন করুন

মিকেল ক্রিস্টেনসেন

লেখক সম্পর্কে

মিকেল ক্রিস্টেনসেন
মিকেল হলেন miklix.com এর স্রষ্টা এবং মালিক। একজন পেশাদার কম্পিউটার প্রোগ্রামার/সফ্টওয়্যার ডেভেলপার হিসেবে তার ২০ বছরেরও বেশি অভিজ্ঞতা রয়েছে এবং বর্তমানে তিনি একটি বৃহৎ ইউরোপীয় আইটি কর্পোরেশনে পূর্ণকালীন কর্মরত। ব্লগিং না করার সময়, তিনি তার অবসর সময় বিভিন্ন আগ্রহ, শখ এবং কার্যকলাপে ব্যয় করেন, যা কিছুটা হলেও এই ওয়েবসাইটে কভার করা বিভিন্ন বিষয়ের মধ্যে প্রতিফলিত হতে পারে।