Greedy algorithm ఒక పరిష్కారాన్ని ఒక్కో అడుగు గా నిర్మిస్తుంది, ఎల్లప్పుడూ ఇప్పుడు ఉత్తమంగా కనిపించే ఎంపికను ఎంచుకుంటుంది - గత ఎంపికలను తిరిగి పరిగణించకుండా. Backtracking లేదు, ముందుకు చూడడం లేదు.
రెండు లక్షణాలు ఉన్నప్పుడు ఇది పనిచేస్తుంది:
ప్రారంభ మరియు ముగింపు సమయాలతో కార్యకలాపాల సమూహం ఇచ్చినప్పుడు, అతిపెక్కు అతివ్యాప్తి కాని కార్యకలాపాలను ఎంచుకోండి.
Greedy వ్యూహం: ముగింపు సమయం ప్రకారం sort చేసి, ఎల్లప్పుడూ ముందుగా ముగిసే కార్యకలాపాన్ని ఎంచుకోండి.
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
ఇది ఎందుకు పనిచేస్తుంది? ముందుగా ముగిసే కార్యకలాపాన్ని ఎంచుకోవడం భవిష్యత్ కార్యకలాపాలకు ఎక్కువ స్థలం ఇస్తుంది. మరే ఎంపికా దీని కంటే మెరుగ్గా చేయలేదు.
అత్యంత తక్కువ-ఫ్రీక్వెన్సీ రెండు చిహ్నాలను పదేపదే కలపడం ద్వారా ఉత్తమ prefix-free binary code నిర్మించండి. ఇది greedy: ప్రతి అడుగులో, చౌకైన జతను కలపండి. ఫలితం ఒక tree, ఇందులో తరచుగా వచ్చే చిహ్నాలకు చిన్న codes ఉంటాయి.
nums[i] index i నుండి గరిష్ట jump పొడవు అయిన array ఇచ్చినప్పుడు, మీరు చివరి index కి చేరుకోగలరా అని నిర్ణయించండి.
Greedy విధానం: ఇప్పటివరకు చేరుకోగల అతి దూర index ను ట్రాక్ చేయండి. ఎడమ నుండి కుడికి scan చేయండి - మీరు ఎప్పుడైనా వెనుకబడితే, false రిటర్న్ చేయండి.
def can_jump(nums):
farthest = 0
for i, jump in enumerate(nums):
if i > farthest:
return False
farthest = max(farthest, i + jump)
return True
Sign in to join the discussion
Jump Game లో, greedy variable 'farthest' ఏమిటి?
Gas stations ఉన్న వృత్తాకార మార్గంలో ప్రయాణించండి. Station i వద్ద gas[i] ఇంధనం పొందుతారు మరియు తదుపరి station కి చేరుకోవడానికి cost[i] ఖర్చవుతుంది. circuit పూర్తి చేయగల starting station కనుగొనండి, లేదా −1 రిటర్న్ చేయండి.
Greedy అంతర్దృష్టి: మొత్తం gas ≥ మొత్తం cost అయితే, పరిష్కారం ఉంటుంది. Running surplus ట్రాక్ చేయండి; అది సున్నా కంటే తగ్గినప్పుడు, సమాధానం ఆ point తర్వాత మొదలవ్వాలి.
ఒకే రకమైన tasks మధ్య n cooldown తో tasks షెడ్యూల్ చేయండి. Greedy: ఎల్లప్పుడూ అత్యధిక ఫ్రీక్వెన్సీ మిగిలిన task ను ఎంచుకోండి. సమాధానం గరిష్ట ఫ్రీక్వెన్సీ మరియు ఎన్ని tasks దాన్ని పంచుకుంటాయి అనే దానిపై ఆధారపడుతుంది.
Tasks: A A A B B C, cooldown = 2
Schedule: A B C A B _ A
Total = 7
Fractional knapsack: అంశాల భాగాలు తీసుకోవచ్చు. Greedy పనిచేస్తుంది - విలువ-ప్రతి-బరువు ప్రకారం sort చేసి, ఉత్తమ నిష్పత్తి ముందుగా తీసుకోండి.
0/1 knapsack: అంశాలు పూర్తిగా తీసుకోవాలి లేదా వదిలేయాలి. ఇక్కడ Greedy విఫలమవుతుంది ఎందుకంటే బరువైన-కానీ-విలువైన అంశాన్ని వదిలేయడం రెండు తేలికైన వాటిని తీసుకోవడం కంటే అధ్వాన్నంగా ఉండవచ్చు. దీనికి dynamic programming అవసరం.
Items: (బరువు=3, విలువ=4), (బరువు=2, విలువ=3), (బరువు=2, విలువ=3)
Capacity: 4
Greedy (ఉత్తమ నిష్పత్తి ముందు): item 1 తీసుకుంటుంది (బ=3, వి=4) → 1 మిగిలింది → మిగతాది సరిపోదు → విలువ = 4
Optimal: items 2+3 తీసుకుంటుంది (బ=4, వి=6) → విలువ = 6 ✗ Greedy విఫలం!
0/1 knapsack సమస్యకు greedy విధానం ఎందుకు విఫలమవుతుంది?
✅ Greedy choice property నిరూపించగలిగినప్పుడు పనిచేస్తుంది:
❌ స్థానిక optima సమగ్ర optima గా కలవనప్పుడు విఫలమవుతుంది:
ప్రామాణిక పద్ధతి: greedy ఎంపిక ఉపయోగించని optimum పరిష్కారం ఉందని ఊహించండి. దాని ఎంపికలలో ఒకదాన్ని greedy ఎంపికతో మార్చినా పరిష్కారం తగ్గదని చూపించండి. ఇది greedy కనీసం అంత మంచిదని నిరూపిస్తుంది.
'Exchange argument' దేని కోసం ఉపయోగిస్తారు?
| అంశం | Greedy | Dynamic Programming | |--------|--------|---------------------| | ఎంపికలు | ప్రతి అడుగుకు ఒక ఉత్తమ ఎంపిక | అన్ని ఉప-సమస్యలను అన్వేషించు | | గతాన్ని తిరిగి చూస్తుందా? | ఎప్పుడూ కాదు | అవును - ఉప-ఫలితాలు నిల్వ చేస్తుంది | | వేగం | సాధారణంగా వేగవంతం | State space పై ఆధారపడుతుంది | | సరైనది | నిరూపించగలిగితే మాత్రమే | ఎల్లప్పుడూ (సరిగ్గా రూపొందిస్తే) |
అనుమానం ఉంటే, greedy తో ప్రారంభించండి - నిరూపించలేకపోతే, DP కి మారండి.