用于计算最大连续子数组和的PHP程序


什么是PHP?

PHP(超文本预处理器)是一种广泛使用的服务器端脚本语言,用于Web开发。它允许开发人员在HTML文件中嵌入代码,从而创建动态网页并与数据库进行交互。PHP以其简单性、多功能性和与流行数据库的广泛集成能力而闻名。它提供了广泛的扩展,并拥有庞大的开发者社区,确保了充足的资源和支持。

用于计算最大连续子数组和的PHP程序

4+ (-1) +2 +1 = 6

最大连续子数组和 = 6

使用Kadane算法

Kadane算法是一种高效的算法,用于在给定数组中找到连续子数组的最大和。它由Jay Kadane于1984年开发。

该算法通过迭代扫描数组并维护两个变量来工作:max_so_far和max_ending_here。以下是算法的工作原理:

  • 将max_so_far和max_ending_here变量初始化为数组的第一个元素,或者如果数组包含负数,则初始化为最小值(例如,PHP_INT_MIN)。

  • 从第二个元素开始迭代数组。

  • 对于每个元素,通过将当前元素添加到其中来更新max_ending_here。

  • 如果max_ending_here变为负数,则将其重置为0,因为在子数组中包含当前元素会减少总和。

  • 如果max_ending_here大于max_so_far,则使用新的最大和更新max_so_far。

  • 对数组的其余元素重复步骤3到5。

  • 遍历整个数组后,max_so_far将保存连续子数组的最大和。

  • 返回max_so_far作为结果。

Kadane算法的时间复杂度为O(n),其中n是数组的大小,因为它只需要单次遍历数组。这使其成为查找最大连续子数组和的高效解决方案。

示例

<?php
// PHP program to print largest
// contiguous array sum
function maxSubArraySum($a, $size)
{
	$max_so_far = PHP_INT_MIN;
	$max_ending_here = 0;
	for ($i = 0; $i < $size; $i++)
	{
		$max_ending_here = $max_ending_here + $a[$i];
		if ($max_so_far < $max_ending_here)
			$max_so_far = $max_ending_here;

		if ($max_ending_here < 0)
			$max_ending_here = 0;
	}
	return $max_so_far;
}
// Driver code
$a = array(-2, 1, -3, 4, -1, 2, 1, -5, 4);
$n = count($a);
$max_sum = maxSubArraySum($a, $n);
echo "Maximum contiguous sum is " ,
						$max_sum;
?>

输出

Maximum contiguous sum is 6

使用算法范式:动态规划

示例

<?php
function maxSubArraySum($a, $size)
{
	$max_so_far = $a[0];
	$curr_max = $a[0];
	for ($i = 1; $i < $size; $i++)
	{
		$curr_max = max($a[$i],
						$curr_max + $a[$i]);
		$max_so_far = max($max_so_far,
						$curr_max);
	}
	return $max_so_far;
}
// Driver Code
$a = array(-2, 1, -3, 4, -1, 2, 1, -5, 4);
$n = sizeof($a);
$max_sum = maxSubArraySum($a, $n);
echo "Maximum contiguous sum is " .
						$max_sum;
?>

输出

Maximum contiguous sum is 6

另一种带有起始和结束索引的方法

示例

<?php
// PHP program to print largest
// contiguous array sum
function maxSubArraySum($a, $size)
{
	$max_so_far = PHP_INT_MIN;
	$max_ending_here = 0;
	$start = 0;
	$end = 0;
	$s = 0;
	for ($i = 0; $i < $size; $i++)
	{
		$max_ending_here += $a[$i];

		if ($max_so_far < $max_ending_here)
		{
			$max_so_far = $max_ending_here;
			$start = $s;
			$end = $i;
		}
		if ($max_ending_here < 0)
		{
			$max_ending_here = 0;
			$s = $i + 1;
		}
	}
	echo "Maximum contiguous sum is ".
					$max_so_far."
"; echo "Starting index ". $start . "
". "Ending index " . $end . "
"; } // Driver Code $a = array(-2, 1, -3, 4, -1, 2, 1, -5, 4); $n = sizeof($a); $max_sum = maxSubArraySum($a, $n); ?>

输出

Maximum contiguous sum is 6 
Starting index 3 
Ending index 6

结论

用于查找最大连续子数组和的PHP程序利用了动态规划和Kadane算法。动态规划方法用于通过将问题分解成更小的子问题并将解决方案存储在数组中来有效地解决问题。

Kadane算法是程序的关键组成部分,负责查找最大连续子数组和。它迭代数组,通过添加当前元素或启动一个新的子数组来不断更新当前和。遇到的最大和存储在`$maxSum`变量中。该程序有效地处理数组中的正数和负数。它通过跟踪起始和结束索引来识别具有最大和的子数组,允许使用`array_slice`提取子数组。

通过使用动态规划和Kadane算法,程序实现了O(n)的时间复杂度,其中n是数组的大小。这确保了在PHP中查找最大连续子数组和的高效解决方案。

更新于:2023年8月1日

196次查看

开启您的职业生涯

通过完成课程获得认证

开始学习
广告