PHP를 사용하여 가장 긴 증가 하위 시퀀스 알고리즘을 작성하는 방법
소개:
최장 증가 하위 시퀀스는 시퀀스에서 가장 긴 증가 하위 시퀀스를 찾는 고전적인 컴퓨팅 문제입니다. 컴퓨터 과학에는 이 문제에 대한 많은 해결책이 있으며 그 중 하나가 동적 프로그래밍입니다. 이 기사에서는 PHP를 사용하여 가장 길게 증가하는 하위 시퀀스 알고리즘을 작성하는 방법을 소개하고 코드 예제를 제공합니다.
1단계: 최장 증가 부분 수열 문제 이해
알고리즘 작성을 시작하기 전에 먼저 최장 증가 부분 수열의 정의를 이해해야 합니다. 시퀀스 A가 주어지면 B가 엄격하게 증가하는 가장 긴 부분 시퀀스 B를 찾고 싶습니다. 예를 들어, 시퀀스 A = [2, 4, 3, 5, 1, 7, 6, 9, 8]의 경우 가장 긴 증가 부분 시퀀스는 B = [2, 3, 5, 7, 9]이며 길이는 다음과 같습니다. 5개 중.
2단계: 동적 프로그래밍을 사용하여 문제 해결
동적 프로그래밍은 가장 길게 증가하는 부분 수열 문제를 해결하는 효과적인 방법입니다. dp[i] 배열을 통해 A[i]로 끝나는 가장 긴 증가 부분 수열의 길이를 기록할 수 있습니다. 다음으로, 배열 A를 반복하고 dp 배열을 업데이트하여 가장 긴 증가 부분 수열의 길이를 얻습니다.
코드 예:
다음은 PHP로 작성된 가장 긴 증가 부분 수열 알고리즘에 대한 예 코드입니다.
function longestIncreasingSubsequence($arr) { $n = count($arr); $dp = array_fill(0, $n, 1); // 初始化 dp 数组,每个元素的初始值都为 1 for ($i = 1; $i < $n; $i++) { for ($j = 0; $j < $i; $j++) { if ($arr[$i] > $arr[$j]) { $dp[$i] = max($dp[$i], $dp[$j] + 1); } } } $maxLength = max($dp); // 最长递增子序列的长度 return $maxLength; } $arr = [2, 4, 3, 5, 1, 7, 6, 9, 8]; $length = longestIncreasingSubsequence($arr); echo "最长递增子序列的长度为:".$length;
위 코드를 실행하면 이전 예와 일치하는 가장 긴 증가 부분 수열 길이 5가 출력됩니다.
3단계: 최적화 알고리즘
위의 동적 프로그래밍 알고리즘을 통해 가장 긴 증가 부분 수열의 길이를 얻을 수 있지만 특정 부분 수열은 얻을 수 없습니다. 가장 긴 증가 부분 수열의 특정 요소도 얻으려면 알고리즘을 약간 최적화할 수 있습니다.
코드 예:
다음은 가장 긴 증가 부분 수열 알고리즘에 대해 더욱 최적화된 예 코드입니다.
function longestIncreasingSubsequence($arr) { $n = count($arr); $dp = array_fill(0, $n, 1); // 初始化 dp 数组,每个元素的初始值都为 1 for ($i = 1; $i < $n; $i++) { for ($j = 0; $j < $i; $j++) { if ($arr[$i] > $arr[$j]) { if ($dp[$j] + 1 > $dp[$i]) { $dp[$i] = $dp[$j] + 1; $prev[$i] = $j; // 记录递增子序列的上一个元素的下标 } } } } $maxLength = max($dp); // 最长递增子序列的长度 // 构建最长递增子序列 $index = array_search($maxLength, $dp); $lis = []; while ($index !== null) { $lis[] = $arr[$index]; $index = $prev[$index] ?? null; } $lis = array_reverse($lis); // 反转子序列,得到递增顺序 return [ 'length' => $maxLength, 'sequence' => $lis ]; } $arr = [2, 4, 3, 5, 1, 7, 6, 9, 8]; $result = longestIncreasingSubsequence($arr); echo "最长递增子序列的长度为:".$result['length']."<br>"; echo "最长递增子序列为:".implode(', ', $result['sequence']);
위 코드를 실행하면 가장 긴 증가 부분 수열의 길이를 5로 출력하고 가장 긴 증가 부분 수열을 [2, 3, 5, 7, 9].
요약:
이 글에서는 PHP를 사용하여 가장 길게 증가하는 하위 시퀀스 알고리즘을 작성하는 방법을 소개하고 코드 예제를 제공합니다. 동적 프로그래밍 아이디어를 통해 우리는 가장 긴 증가 부분 수열 문제를 효율적으로 해결할 수 있습니다. 이 글이 최장 증가 부분 수열 알고리즘을 배우고 사용하려는 독자들에게 도움이 되기를 바랍니다.
위 내용은 PHP를 사용하여 가장 길게 증가하는 하위 시퀀스 알고리즘을 작성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!