ホームページ >バックエンド開発 >PHPチュートリアル >PHP の最長共通部分列問題に対する最適な解決策を達成するために貪欲アルゴリズムを使用するにはどうすればよいでしょうか?
貪欲アルゴリズムを使用して、PHP の最長共通部分列問題に対する最適な解決策を達成するにはどうすればよいでしょうか?
最長共通部分列 (LCS) 問題は、2 つのシーケンス内の最長共通部分列の長さを見つけるために使用される古典的なアルゴリズム問題です。貪欲アルゴリズムは、最長共通部分列問題を解くために一般的に使用される戦略であり、現在の最適な局所解を選択することによって大域的な最適解を構築します。
PHP では、動的プログラミングを使用して貪欲アルゴリズムを実装し、最長共通部分列問題を解決できます。具体的な実装手順は次のとおりです。
ステップ 1: 問題を定義する
まず、問題を明確に定義する必要があります。 2 つのシーケンス X と Y が与えられた場合、それらの最長の共通部分シーケンスの長さを見つけるように求められます。
ステップ 2: 2 次元配列を作成する
2 次元配列 $dp を作成します。行数は X シーケンスの長さに 1 を加えたもの、列数は X シーケンスの長さです。 Y シーケンスに 1 を加えたもの。
$dp = array(); $lengthX = strlen($X); $lengthY = strlen($Y); for ($i = 0; $i <= $lengthX; $i++) { $dp[$i] = array(); for ($j = 0; $j <= $lengthY; $j++) { $dp[$i][$j] = 0; } }
ステップ 3: 最長共通部分列の長さを解決する
2 次元配列 $dp を埋めることによって、最長共通部分列の長さを見つけることができます。 X シーケンスと Y シーケンスの各要素を順番に走査し、貪欲戦略に従って $dp 配列の値を更新します。
for ($i = 1; $i <= $lengthX; $i++) { for ($j = 1; $j <= $lengthY; $j++) { if ($X[$i - 1] == $Y[$j - 1]) { $dp[$i][$j] = $dp[$i - 1][$j - 1] + 1; } else { $dp[$i][$j] = max($dp[$i][$j - 1], $dp[$i - 1][$j]); } } }
ステップ 4: 最長の共通部分列の長さを返す
最後に、$dp 配列の最後の要素、つまり $dp[$lengthX][ を通じて最長の共通部分列を取得できます。 $lengthY] サブシーケンスの長さ。
$lengthLCS = $dp[$lengthX][$lengthY]; return $lengthLCS;
完全な PHP コード例は次のとおりです:
function longestCommonSubsequence($X, $Y) { $dp = array(); $lengthX = strlen($X); $lengthY = strlen($Y); for ($i = 0; $i <= $lengthX; $i++) { $dp[$i] = array(); for ($j = 0; $j <= $lengthY; $j++) { $dp[$i][$j] = 0; } } for ($i = 1; $i <= $lengthX; $i++) { for ($j = 1; $j <= $lengthY; $j++) { if ($X[$i - 1] == $Y[$j - 1]) { $dp[$i][$j] = $dp[$i - 1][$j - 1] + 1; } else { $dp[$i][$j] = max($dp[$i][$j - 1], $dp[$i - 1][$j]); } } } $lengthLCS = $dp[$lengthX][$lengthY]; return $lengthLCS; } $X = "ABCD"; $Y = "ACDF"; $lengthLCS = longestCommonSubsequence($X, $Y); echo "最长公共子序列的长度为:" . $lengthLCS;
上記のコード例を通じて、欲張りアルゴリズムを使用して PHP の最長共通部分列問題を解決し、最長共通部分列を取得できます。長さ。
以上がPHP の最長共通部分列問題に対する最適な解決策を達成するために貪欲アルゴリズムを使用するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。