পাঠ ১২ · ৫৭-এর মধ্যে · মডিউল ৩
Home / Courses / Design and Analysis of Algorithms / রিকারেন্স রিলেশন

রিকার্সন ট্রি মেথড

The recursion tree method
১২ মিনিট পড়া মধ্যম-কঠিন · Intermediate-Advanced Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • রিকার্সন ট্রি আঁকার পদ্ধতি — নোড, স্তর, গভীরতা, এবং লিফ
  • $T(n) = 2T(n/2) + n^2$-এর জন্য সম্পূর্ণ ডায়াগ্রাম-সহ ডেরিভেশন — কেন রুট স্তর প্রাধান্য পায়
  • জ্যামিতিক সিরিজ কীভাবে "কোন স্তর প্রাধান্য পাবে" তা নির্ধারণ করে (সমান / ক্রমহ্রাসমান / ক্রমবর্ধমান)
  • ডেরিভ করা বাউন্ড সত্যিকারের কোড দিয়ে পরীক্ষামূলকভাবে যাচাই করা

১ · রিকার্সন ট্রি মেথড — ধারণা

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

ধাপ ১ · গাছ আঁকো
রুট নোড = মূল কলের "নিজস্ব" খরচ (রিকার্সিভ কল বাদে)। প্রতিটি রিকার্সিভ কলের জন্য একটি চাইল্ড নোড, যতক্ষণ না বেস কেসে (লিফ) পৌঁছাও।
ধাপ ২ · প্রতি স্তরের খরচ যোগ করো
একই গভীরতার সব নোডের খরচ যোগ করে সেই স্তরের মোট খরচ বের করো।
ধাপ ৩ · সব স্তর যোগ করো
রুট থেকে লিফ পর্যন্ত সব স্তরের মোট খরচ যোগ করে সামগ্রিক $T(n)$ বের করো (প্রায়ই একটি সিরিজ হিসেবে)।

২ · উদাহরণ — $T(n) = 2T(n/2) + n^2$

এই রিকারেন্সে প্রতিটি কল তার দুটো উপসমস্যার (প্রতিটির আকার $n/2$) বাইরে নিজে $n^2$ পরিমাণ কাজ করে (যেমন "কম্বাইন" ধাপে)। রুট নোডের খরচ তাই $n^2$, আকার $n$। প্রতিটি চাইল্ড নোডের খরচ $(n/2)^2$, আকার $n/2$ — এবং এমন দুটো চাইল্ড আছে। নিচের ডায়াগ্রামে প্রথম কয়েকটি স্তর দেখানো হয়েছে:

খরচ: n² (আকার n) — স্তর ০ খরচ: (n/2)² আকার n/2 খরচ: (n/2)² আকার n/2 স্তর ১ মোট: n²/2 (n/4)² (n/4)² (n/4)² (n/4)² স্তর ২ মোট: n²/4 ⋮ আরও $\log_2 n$ স্তর পর্যন্ত চলতে থাকে, প্রতি স্তরে খরচ অর্ধেক হয় লিফ স্তর: n টি নোড, প্রতিটির খরচ Θ(1) — মোট Θ(n)
প্রতিটি স্তরে নোড সংখ্যা দ্বিগুণ হয় কিন্তু প্রতি নোডের খরচ চারভাগের একভাগ হয়ে যায় — নিট ফল: স্তর-প্রতি মোট খরচ প্রতিবার অর্ধেক হয়ে যায়। তাই রুট স্তরের খরচ ($n^2$) পুরো যোগফলে প্রাধান্য পায়।

সাধারণভাবে, গভীরতা $i$-তে $2^i$টি নোড থাকে, প্রতিটির আকার $n/2^i$ এবং খরচ $(n/2^i)^2$। সেই স্তরের মোট খরচ:

$$2^i \times \left(\frac{n}{2^i}\right)^2 = 2^i \times \frac{n^2}{4^i} = \frac{n^2}{2^i}$$

গাছটির গভীরতা $\log_2 n$ (যেখানে আকার $1$-এ পৌঁছে বেস কেস হয়ে যায়), তাই মোট খরচ হলো $i=0$ থেকে $i=\log_2 n - 1$ পর্যন্ত প্রতি স্তরের খরচের যোগফল, প্লাস লিফ স্তরের খরচ ($n$টি লিফ, প্রতিটি $\Theta(1)$):

$$T(n) = \sum_{i=0}^{\log_2 n - 1} \frac{n^2}{2^i} \;+\; \Theta(n) = n^2\left(1+\frac12+\frac14+\cdots\right) + \Theta(n)$$

বন্ধনীর ভেতরের সিরিজটি একটি জ্যামিতিক সিরিজ (geometric series), অনুপাত $\frac12 < 1$। এমন সিরিজের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য — যতগুলো পদই থাকুক না কেন (এখানে $\log_2 n$টি পদ), যোগফল কখনোই প্রথম পদের দ্বিগুণের বেশি হয় না: $1+\frac12+\frac14+\cdots < \frac{1}{1-1/2} = 2$। তাই:

$$T(n) < 2n^2 + \Theta(n) = \Theta(n^2)$$

অর্থাৎ, রুট স্তরের খরচই ($n^2$) পুরো যোগফলে প্রাধান্য পায় — বাকি সব স্তর মিলিয়েও রুটের সমান কাজের বেশি যোগ করতে পারে না, কারণ প্রতি স্তরে খরচ জ্যামিতিকভাবে কমছে। এটাই এই ধরনের রিকারেন্সের (যেখানে "কম্বাইন" খরচ উপসমস্যার সংখ্যার তুলনায় দ্রুত বাড়ে) একটি সাধারণ প্যাটার্ন — L13-এর মাস্টার থিওরেমে এই একই রিকারেন্স আবার দেখা যাবে, ঠিক এই কারণেই এটি "কেস ৩"-এর একটি ক্লাসিক উদাহরণ হবে।

৩ · সত্যিকারের কোড — অনুপাত পরীক্ষা করা

উপরের ডেরিভেশন অনুযায়ী মোট খরচের প্রধান পদ $2n^2$ — অর্থাৎ $T(n)/n^2$ অনুপাতের $2$-এর দিকে এগিয়ে যাওয়ার কথা। নিচের কোড রিকারেন্সটি সরাসরি রিকার্সনের মাধ্যমে গণনা করে যাচাই করছে:

Python
def T(n):
    if n <= 1:
        return 1                     # বেস কেস T(1) = 1
    return 2 * T(n // 2) + n ** 2    # রিকারেন্স নিজেই -- কোনো সূত্র অনুমান নয়

sizes = [2, 4, 8, 16, 32, 64, 128, 256]

print(f"{'n':>5} | {'T(n)':>9} | {'n^2':>9} | {'T(n)/n^2':>10}")
for n in sizes:
    t = T(n)
    ratio = t / (n ** 2)
    print(f"{n:>5} | {t:>9} | {n**2:>9} | {ratio:>10.5f}")

    
আউটপুটে $T(n)$-এর মান হবে $6, 28, 120, 496, 2016, 8128, 32640, 130816$ — এবং অনুপাত $T(n)/n^2$ ক্রমাগত বাড়তে থাকবে: $1.5,\ 1.75,\ 1.875,\ 1.9375,\ 1.96875,\ 1.98438,\ 1.99219,\ 1.99609$ — অর্থাৎ এটি নিচ থেকে $2$-এর দিকে এগিয়ে আসছে, ঠিক যেমনটা রিকার্সন ট্রির জ্যামিতিক-সিরিজ ডেরিভেশন থেকে প্রত্যাশিত। প্রকৃতপক্ষে, $T(1)=1$ বেস কেসের জন্য এই রিকারেন্সের সঠিক বদ্ধ-আকারের সমাধান হলো ঠিক $T(n) = 2n^2 - n$ (যাচাই করুন: $n=256$-এ $2\times65536 - 256 = 130816$, কোডের আউটপুটের সাথে হুবহু মেলে)। যেহেতু $T(n)/n^2 = 2 - 1/n \to 2$, তাই অনুপাত সবসময় $2$-এর নিচে থাকবে কিন্তু ক্রমাগত কাছে আসতে থাকবে — এটাই $\Theta(n^2)$-এর সংজ্ঞা মাফিক আচরণ, এবং এর "লিডিং ধ্রুবক" ঠিক $2$ — যা উপরে জ্যামিতিক সিরিজ থেকে ডেরিভ করা আপার বাউন্ডের সাথে (প্রায় সমতায়) মিলে যায়।
মূল কথা · Key takeaway

রিকার্সন ট্রি মেথড একটি রিকারেন্সকে স্তরে-স্তরে ভেঙে দেখায় — প্রতি স্তরের মোট খরচের প্যাটার্ন (সমান, ক্রমহ্রাসমান, নাকি ক্রমবর্ধমান) সরাসরি বলে দেয় কোন স্তর (রুট, মাঝামাঝি, নাকি লিফ) চূড়ান্ত বাউন্ডে প্রাধান্য পাবে। L11-এর $T(n)=2T(n/2)+n$-এ প্রতি স্তরের খরচ ছিল সমান ($n$ প্রতি স্তরে), তাই $\log n$টি স্তর মিলিয়ে একটি $\log$ ফ্যাক্টর যোগ হয়েছিল। এখানে খরচ জ্যামিতিকভাবে কমছে, তাই রুটই প্রাধান্য পেয়েছে। এই পর্যবেক্ষণ-ভিত্তিক পদ্ধতিকে একটি সুনির্দিষ্ট, প্রমাণযোগ্য সূত্রে রূপ দেওয়াই পরের পাঠ (L13) — মাস্টার থিওরেম — এর কাজ।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ রিকার্সন ট্রি মেথড থেকে পাওয়া ফলাফল কি নিজে থেকেই একটা "প্রমাণ", নাকি শুধু একটা অনুমান তৈরির টুল?

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

প্র ০২ যদি রিকারেন্সটি হতো $T(n) = 2T(n/2) + n^3$ (অর্থাৎ কম্বাইন খরচ আরও বেশি বাড়ে), তাহলে কি রুট স্তর তখনও প্রাধান্য পেত?

হ্যাঁ, এবং আরও জোরালোভাবে। এখানে স্তর $i$-এর মোট খরচ হবে $2^i \times (n/2^i)^3 = n^3/4^i$ — অনুপাত এবার $\frac14$ (আগের উদাহরণের $\frac12$-এর চেয়েও দ্রুত কমছে)। জ্যামিতিক সিরিজ $1+\frac14+\frac1{16}+\cdots$ এমনকি আরও দ্রুত $\frac{1}{1-1/4}=\frac43$-এ কনভার্জ করে, তাই রুট স্তরের খরচ ($n^3$) আরও স্পষ্টভাবে প্রাধান্য পায় এবং $T(n) = \Theta(n^3)$।

প্র ০৩ উপরের ডায়াগ্রামে লিফ স্তরের মোট খরচ $\Theta(n)$ বলা হয়েছে — এটা কীভাবে এলো?

গাছের গভীরতা $\log_2 n$ (যেখানে আকার $n/2^{\log_2 n} = 1$-এ পৌঁছায়, বেস কেস)। সেই গভীরতায় নোড সংখ্যা $2^{\log_2 n} = n$টি — অর্থাৎ ঠিক $n$টি লিফ নোড আছে, প্রতিটির খরচ $\Theta(1)$ (বেস কেসের সংজ্ঞা অনুযায়ী)। তাই লিফ স্তরের মোট খরচ $n \times \Theta(1) = \Theta(n)$ — যা $\Theta(n^2)$-এর তুলনায় নগণ্য, তাই চূড়ান্ত ফলাফলে এটি প্রাধান্য পায় না।

অনুশীলন

  1. চিন্তা করুন: $T(n) = 4T(n/2) + n$-এর জন্য রিকার্সন ট্রি আঁকলে গভীরতা $i$-এ কতগুলো নোড থাকবে, প্রতিটির খরচ কত হবে, এবং সেই স্তরের মোট খরচ কী হবে? এই ক্ষেত্রে কি খরচ স্তরে-স্তরে বাড়ে না কমে?

    গভীরতা $i$-এ নোড সংখ্যা $4^i$, প্রতিটির আকার $n/2^i$ ও খরচ $n/2^i$ (যেহেতু কম্বাইন খরচ এখানে রৈখিক)। সেই স্তরের মোট খরচ $4^i \times n/2^i = n \times 2^i$ — যা $i$ বাড়ার সাথে সাথে বাড়ে (আগের দুই উদাহরণের বিপরীত, যেখানে খরচ কমছিল)। এর মানে এখানে লিফ স্তর প্রাধান্য পাবে, রুট নয় — এবং যোগফল হবে $\Theta(n^2)$ (মাস্টার থিওরেম দিয়ে যাচাই করা যায়: $a=4,b=2$, $\log_2 4 = 2$, $f(n)=n=O(n^{2-\epsilon})$ — এটি L13-এর কেস ১-এর একটি উদাহরণ)।

  2. পরীক্ষা করুন: উপরের কোড সেলে রিকারেন্সটি পরিবর্তন করে T(n) = 4 * T(n // 2) + n করুন এবং T(n)/n^2-এর বদলে T(n)/n ও T(n)/(n**2) — দুটোই প্রিন্ট করে দেখুন কোনটা একটি ধ্রুবকের দিকে এগোয়।

    T(n)/n ক্রমাগত বাড়তেই থাকবে (কোনো ধ্রুবকে থামবে না), কিন্তু T(n)/(n**2) একটি ধ্রুবকের (প্রায় $3$-এর কাছাকাছি, কারণ এই বেস কেসে বদ্ধ-আকারের সমাধান আনুমানিক $T(n)\approx 3n^2-2n$) দিকে এগিয়ে যাবে — যা নিশ্চিত করে $T(n)=\Theta(n^2)$, ঠিক আগের প্র্যাকটিস প্রশ্নের অনুমানের সাথে মিলিয়ে।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

  • কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ অ্যাসিম্পটোটিক অ্যানালাইসিস, রিকারেন্স, ডিভাইড অ্যান্ড কনকার, গ্রিডি, DP, গ্রাফ অ্যালগরিদম, ব্যাকট্র্যাকিং, স্ট্রিং অ্যালগরিদম, অ্যামর্টাইজড অ্যানালাইসিস, NP-কমপ্লিটনেস ও অ্যাপ্রক্সিমেশন — বাকি পাঠগুলো শীঘ্রই যুক্ত হবে।
  • Data Structures & Algorithms কোর্স সহোদর কোর্স মার্জ সর্টের মতো ডিভাইড অ্যান্ড কনকার অ্যালগরিদমের ইমপ্লিমেন্টেশন সেই কোর্সে দেখানো হয়েছে — এখানে আমরা তাদের রিকারেন্স রিলেশন ভিজ্যুয়ালি ডেরিভ করছি।
  • সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design, Cybersecurity, Cloud Computing & DevOps, Computer Networks, Operating Systems, Computer Architecture, Programming Languages & Compiler Design, Software Engineering & Git, Theory of Computation, Engineering Economics, Full-Stack Web Frameworks, Mobile App Development, Ethics in Computing & AI Safety, Software Testing & Quality Assurance ও Design and Analysis of Algorithms — সব এক জায়গায়।
আগের পাঠ
সাবস্টিটিউশন মেথড