মডিউল ১০_৩ঃ Find অপারেশন ইমপ্লিমেন্টেশন

এখন আমরা find অপারেশনটা ইমপ্লিমেন্ট করার চেষ্টা করব।

এটার জন্য আমরা কিছু নোড নিয়ে সেটার প্যারেন্ট এ্যারেটা একটু দেখিঃ

এখানে ধর আমরা ২ এর লিডারকে জানতে চাইলাম। তাহলে আমরা ২ কে জিজ্ঞেস করব ওর প্যারেন্ট কে। এই ক্ষেত্রে সেটা ১। আমরা ১ এর জাছে যাবো আর তাকে জিজ্ঞেস করবো তার প্যারেন্ট কে। এই ক্ষেত্রে সে বলবে ৩। তারপর ৩ এর কাছে গিয়ে জিজ্ঞেস করব তার প্যারেন্ট কে। ৩ বলবে সে নিজেই কেননা তার প্যারেন্ট -১। তাহলে আমরা বুঝে যাব ৩ হলো লিডার।

// Some code
int dsu_find(int node)
{
    if (par[node] == -1)
        return node;
    return dsu_find(par[node]);
}

উপরের ইমপ্লিমেন্টেশনের টাইম কমপ্লেক্সিটি O(N)|

এটাকে আরো অপ্টিমাইজ করে O(logn) করা সম্ভব। সেটি হচ্ছে আমরা যখন কোনো স্পেসিফিক নোড এর লিডার বের করব তখন সেইম গ্রুপের বাকি সকল এলিমেন্ট এর লিডার ও তাকে সেট করে দিব।

যেমনঃ উপরের এক্সাম্পল্টা যদি নেই তখন আমরা ১ এর লিডার ৩ পাওয়ার পর ২ এর লিডার ও ৩ সেট করে দিব প্যারেন্ট এ্যারেতে।

// Some code
int dsu_find(int node)
{
    if (par[node] == -1)
        return node;
    int leader = dsu_find(par[node]);
    par[node] = leader;
    return leader;
}

Last updated