تقوم الخوارزمية الجشعة ببناء حل خطوة بخطوة، واختيار الخيار الذي يبدو أفضل الآن دائمًا - دون إعادة النظر في الاختيارات السابقة. لا تراجع ولا نظر للأمام.
إنه يعمل عندما تحتوي على خاصيتين:
بالنظر إلى مجموعة من الأنشطة ذات أوقات البدء والانتهاء، حدد الحد الأقصى للأنشطة غير المتداخلة.
استراتيجية الجشع: قم بالفرز حسب وقت الانتهاء، واختر دائمًا النشاط الذي ينتهي مبكرًا.
def max_activities(intervals):
intervals.sort(key=lambda x: x[1])
count, end = 0, 0
for s, e in intervals:
if s >= end:
count += 1
end = e
return count
لماذا يعمل هذا؟ إن اختيار النشاط الذي تم الانتهاء منه في أقرب وقت يترك المجال الأكبر للأنشطة المستقبلية. لا يوجد خيار آخر يمكن أن يفعل ما هو أفضل.
أنشئ رمزًا ثنائيًا مثاليًا خاليًا من البادئات من خلال الدمج المتكرر للرمزين الأقل ترددًا**. هذا جشع: في كل خطوة، قم بدمج الزوج الأرخص. والنتيجة هي شجرة حيث تحصل الرموز المتكررة على رموز قصيرة.
بالنظر إلى مصفوفة حيث nums[i] هو الحد الأقصى لطول القفز من الفهرس i، حدد ما إذا كان يمكنك الوصول إلى الفهرس الأخير.
النهج الجشع: تتبع أبعد مؤشر يمكن الوصول إليه حتى الآن. قم بالمسح من اليسار إلى اليمين - إذا تخلفت عن الركب، فارجع كاذبًا.
def can_jump(nums):
farthest = 0
for i, jump in enumerate(nums):
if i > farthest:
return False
farthest = max(farthest, i + jump)
return True
في لعبة القفز، ماذا يمثل المتغير الجشع ”الأبعد”؟
تسجيل الدخول للانضمام إلى النقاش
##محطة بنزين
سافر في طريق دائري مع محطات الوقود. في المحطة i تحصل على gas[i] وقود وتنفق cost[i] للوصول إلى المحطة التالية. ابحث عن محطة البداية التي تتيح لك إكمال الدائرة، أو العودة إلى −1.
الرؤية الجشعة: إذا كان إجمالي الغاز ≥ التكلفة الإجمالية، فإن الحل موجود. تتبع الفائض الجاري؛ وعندما ينخفض تحت الصفر، يجب أن تبدأ الإجابة بعد تلك النقطة.
جدولة المهام مع فترة تباطؤ قدرها n بين المهام المتطابقة. الجشع: اختر دائمًا المهمة المتبقية الأكثر تكرارًا. تعتمد الإجابة على الحد الأقصى للتكرار وعدد المهام المشتركة فيه.
Tasks: A A A B B C, cooldown = 2
Schedule: A B C A B _ A
Total = 7
حقيبة الظهر الجزئية: يمكنك أخذ أجزاء من العناصر. يعمل الجشع - قم بالفرز حسب القيمة لكل وزن، خذ أفضل نسبة أولاً.
0/1 حقيبة الظهر: العناصر هي كل شيء أو لا شيء. الجشع ** يفشل ** هنا لأن تخطي عنصر ثقيل ولكن ثمين قد يكون أسوأ من تناول عنصرين أخف. وهذا يتطلب البرمجة الديناميكية.
Items: (weight=3, value=4), (weight=2, value=3), (weight=2, value=3)
Capacity: 4
Greedy (best ratio first): takes item 1 (w=3, v=4) → 1 remaining → can't fit rest → value = 4
Optimal: takes items 2+3 (w=4, v=6) → value = 6 ✗ Greedy fails!
لماذا يفشل النهج الجشع في مشكلة الحقيبة 0/1؟
✅ يعمل عندما يمكنك إثبات خاصية الاختيار الجشع:
❌ يفشل عندما لا يتحول الأمثل المحلي إلى الأمثل العالمي:
الأسلوب القياسي: افترض الحل الأمثل الذي لا يستخدم الخيار الجشع. أظهر أنه يمكنك استبدال أحد اختياراته بالخيار الجشع دون أن تجعل الحل أسوأ. وهذا يثبت أن الجشع جيد على الأقل.
ما هي ”وسيطة التبادل” المستخدمة؟
| الجانب | الجشع | البرمجة الديناميكية | |--------|--------|--------------------| | الاختيارات | أفضل خيار واحد لكل خطوة | استكشاف كافة المشاكل الفرعية | | يعيد النظر في الماضي؟ | أبدا | نعم - مخازن النتائج الفرعية | | السرعة | عادة أسرع | يعتمد على مساحة الدولة | | صحة | فقط إذا كان يمكن إثباته | دائمًا (إذا صيغت بشكل صحيح) |
عندما تكون في شك، ابدأ بالجشع - إذا لم تتمكن من إثبات نجاحه، فانتقل إلى DP.