تقسیم و حل (Divide and Conquer)

تکنیک تقسیم و حل: شکستن مسئله به زیرمسئله‌های مستقل، حل بازگشتی و ترکیب؛ پایه Merge و Quick Sort

تقسیم و حل چیست؟

Divide and Conquer سه مرحله دارد:

  1. تقسیم (Divide): مسئله را به چند زیرمسئله مستقل کوچک‌تر بشکن
  2. حل (Conquer): زیرمسئله‌ها را بازگشتی حل کن (اگر خیلی کوچک‌اند، مستقیم)
  3. ترکیب (Combine): جواب‌ها را به جواب اصلی ترکیب کن

مثال‌های آشنا

الگوریتمتقسیمحلترکیب
Merge Sortنصف کردن آرایهمرتب‌کردن بازگشتیادغام دو نصف مرتب
Quick Sortپارتیشن حول پیوتمرتب‌کردن دو بخشنیازی نیست! (درجا)
جستجوی دودوییانتخاب نیمه درستجستجو در همان نیمهمستقیم پاسخ
ضرب اعداد بزرگشکستن ارقامضرب‌های کوچک‌ترجمع جابه‌جایی‌ها

چرا کارآمد است؟

تقسیم لگاریتمی است: هر تقسیم اندازه را نصف می‌کند، پس فقط log n سطح داریم. اگر هر سطح O(n) کار کند، کل: O(n log n) — انقلاب نسبت به O(n²)!

مثال غیر از مرتب‌سازی: Maximum Subarray

پیدا کردن زیرآرایه متوالی با بیشترین مجموع:

  1. آرایه را نصف کن
  2. بهترین زیرآرایه: یا کاملاً در چپ، یا کاملاً در راست، یا از وسط عبور می‌کند
  3. حالت عبوری: از وسط به دو طرف بیشترین امتداد را بگیر
  4. بیشینه‌ی سه حالت

تقسیم و حل در برابر برنامه‌نویسی پویا

ویژگیتقسیم و حلبرنامه‌نویسی پویا
زیرمسئله‌هامستقل ✓همپوشان!
محاسبه تکراریندارددارد ← ذخیره (memo)
مثالMerge Sort، جستجوی دودوییفیبوناچی، کوله‌پشتی
نکته: اگر زیرمسئله‌ها مستقل‌اند ← تقسیم و حل. اگر تکراری/همپوشان‌اند ← برنامه‌نویسی پویا (مبحث بعدی). تشخیص این تفاوت، کلید طراحی الگوریتم است!

جمع‌بندی

این مبحث بخشی از دوره آموزش کامل ساختار داده و الگوریتم است.

ابزارهای مرتبط