الگوریتم حریصانه (Greedy)

الگوریتم حریصانه: انتخاب بهینه محلی در هر گام؛ مسئله سکه‌ها و انتخاب فعالیت و اینکه کجا حریصی جواب می‌دهد

الگوریتم حریصانه چیست؟

Greedy Algorithm در هر گام، بهترین انتخاب محلی (فعلی) را می‌کند و هرگز به عقب برنمی‌گردد — امیدوار است سری از انتخاب‌های خوب محلی، به جواب خوب سراسری برسد.

مثال کلاسیک: مسئله سکه‌ها

پرداخت ۳۶۰ تومان با سکه‌های [۲۰۰، ۱۰۰، ۵۰، ۱۰]:

  1. حریصانه: بزرگ‌ترین سکه ممکن ← ۲۰۰
  2. باقی ۱۶۰ ← بزرگ‌ترین: ۱۰۰
  3. باقی ۶۰ ← ۵۰
  4. باقی ۱۰ ← ۱۰ ✓

جواب: ۴ سکه — بهینه! اما همیشه؟ با سکه‌های [۱، ۳، ۴] برای ۶: حریصانه ۴+۱+۱ = ۳ سکه، اما بهینه ۳+۳ = ۲ سکه است!

کی حریصی جواب بهینه می‌دهد؟

دو ویژگی لازم:

اثبات این ویژگی‌ها سخت‌ترین بخش است! (مثلاً در دایکسترا و Kruskal اثبات شده‌اند)

مثال: انتخاب فعالیت

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

  1. فعالیت‌ها را بر اساس زمان پایان مرتب کن
  2. اولین را بردار
  3. هر فعالیت بعدی که بعد از پایان قبلی شروع می‌شود را بردار

این حریصی (انتخاب زودترین پایان) بهینه اثبات شده است!

حریصانه در برابر برنامه‌نویسی پویا

ویژگیحریصانهبرنامه‌نویسی پویا
تصمیم‌هاقطعی، بدون بازگشتهمه گزینه‌ها بررسی می‌شوند
سرعتسریع (معمولاً O(n log n)) ✓کندتر
تضمین بهینهفقط با اثبات ویژگی‌هاهمیشه ✓
مثالدایکسترا، Kruskal، Huffmanکوله‌پشتی ۰/۱، فیبوناچی

الگوریتم‌های حریصانه معروف

هشدار: قبل از اعتماد به حریصی، با مثال نقض امتحان کنید! حریصی بدون اثبات = جواب احتمالاً غلط. کوله‌پشتی ۰/۱ مثال کلاسیک جایی است که حریصی شکست می‌خورد.

جمع‌بندی

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

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