貪欲なアルゴリズムは、一度に 1 ステップずつ、過去の選択を再検討することなく、今最も最適と思われるオプションを常に選択してソリューションを構築します。後戻りもせず、先を見据えることもありません。
次の 2 つのプロパティが成立する場合に機能します。
開始時刻と終了時刻を持つ一連のアクティビティを指定して、重複しないアクティビティの最大数を選択します。
貪欲な戦略: 終了時刻で並べ替え、常に最も早く終了するアクティビティを選択します。
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
なぜこれが機能するのでしょうか?最も早く終了するアクティビティを選択すると、将来のアクティビティのための余地が最大限に残ります。これ以上の選択肢はありません。
2 つの最低周波数のシンボルを繰り返しマージすることで、最適なプレフィックスフリーのバイナリ コードを構築します。これは欲張りです。各ステップで最も安価なペアをマージします。その結果、頻繁に使用されるシンボルが短いコードを取得するツリーが作成されます。
nums[i] がインデックス i からの最大ジャンプ長である配列を指定して、最後のインデックスに到達できるかどうかを判断します。
貪欲なアプローチ: これまでに到達可能な最も遠いインデックスを追跡します。左から右にスキャンします。遅れた場合は 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
ジャンプ ゲームでは、貪欲な変数「最も遠い」は何を表しますか?
ガソリンスタンドのある環状ルートを走行します。ステーション 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 ナップザック: アイテムは全か無かです。重くても貴重なアイテムをスキップすることは、軽いアイテムを 2 つ手に入れるより悪い可能性があるため、ここでは貪欲は失敗します。これには動的プログラミングが必要です。
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 ナップザック問題で貪欲なアプローチが失敗するのはなぜですか?
✅ 機能 貪欲な選択の性質を証明できる場合:
❌ **ローカル最適化がグローバル最適化に構成されていない場合、**失敗します。
標準的な手法: 貪欲な選択を使用しない最適なソリューションを想定します。解決策を悪化させることなく、選択肢の 1 つを貪欲な選択肢と 交換できることを示してください。これは、貪欲であることが少なくとも同じくらい良いことを証明しています。
「交換引数」は何に使用されますか?
|側面 |貪欲 |動的プログラミング | |----------|----------|----------| |選択肢 |ステップごとに 1 つの最適な選択肢 |すべての下位問題を調べる | |過去を振り返る? |決して |はい - サブ結果を保存します。 |スピード |通常は速い |状態空間に依存 | |正確さ |証明可能な場合のみ |常に (正しく定式化されている場合) |
疑わしい場合は、貪欲に始めてください。機能することが証明できない場合は、DP に切り替えてください。