>  기사  >  백엔드 개발  >  PHP를 사용하여 가장 길게 증가하는 하위 시퀀스 알고리즘을 작성하는 방법

PHP를 사용하여 가장 길게 증가하는 하위 시퀀스 알고리즘을 작성하는 방법

PHPz
PHPz원래의
2023-07-07 10:10:561119검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.