Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

貪欲法

概要

貪欲法(Greedy Algorithm) は、各ステップで「その時点で最も良く見える選択」を繰り返すことで解を構築するアルゴリズム設計手法である。

基本的な考え方

  • 問題をステップに分割し、各ステップで局所的に最適な選択をする

  • 一度した選択は覆さない(後戻りしない)

  • 全体の最適解を保証するには、問題が以下の2つの性質を満たす必要がある

性質説明
貪欲選択性(Greedy Choice Property)局所最適な選択を重ねることで大域最適解に到達できる
最適部分構造(Optimal Substructure)問題の最適解が部分問題の最適解を含む

利点と欠点

利点

  • 実装がシンプルで理解しやすい

  • 多くの場合、動的計画法より高速

欠点

  • 適用できる問題が限られる(すべての最適化問題に使えるわけではない)

  • 局所最適解が大域最適解にならないケースがある(例:一般的なコイン問題、0/1 ナップサック問題)

応用例

例1: コイン問題

Q. XX 円の金額を日本の硬貨で支払うとき、必要な硬貨の最小枚数は?

大きい硬貨から貪欲に使っていくことで最小枚数が得られる(日本円の硬貨体系では成立する)。

10

例2: 区間スケジューリング問題

Q. 複数の仕事(開始時刻・終了時刻が決まっている)の中から、重複しない範囲で 最大数 の仕事をこなすには?

貪欲な選択: 終了時刻が早い仕事から順に選ぶ。

例3: 分数ナップサック問題

Q. 容量 WW のナップサックに、重さ wiw_i・価値 viv_i のアイテムを詰めるとき価値を最大化するには? アイテムを 分割して詰めてよい(分数ナップサック)場合は貪欲法で最適解が得られる。

貪欲な選択: 単位重量あたりの価値(vi/wiv_i / w_i)が高いアイテムから詰める。

※ アイテムの分割が許されない 0/1 ナップサック問題 では貪欲法では最適解が保証されない(動的計画法が必要)。