您的位置:首页 > 编程语言 > PHP开发

【最大子数组问题】php实现

2015-03-14 21:13 239 查看
这个版本还有bug,待修复

<?php
//最大子数组问题:
//数组a[l...h]中有正有负,求a的连续最大子数组。
//如果把a分开两半,则子数组可能有3种情况
//1.子数组在a[l...m]中
//2.子数组在a[m+1...h]中
//3.子数组跨越a[l...m]和a[m+1...h]
//而a的最大子数组是这三种情况中的最大者,1、2两种情况可以递归地求,剩下的全部工作就是寻找跨越中点m的子数组然后取最大值
/*
*函数find_crossing_arr用来寻找跨越中点的最大子数组
*/
function find_crossing_arr($arr)
{
$mid=intval(count($arr)/2);//中点
$left_sum=-9999;
$sum=0;
for($i=$mid;$i>=0;$i--)//遍历中点左边所有,找到最大和$left_sum和最大和时左边的下标$left_k
{
$sum=$sum+$arr[$i];
if($sum>$left_sum)
{
$left_sum=$sum;
$left_k=$i;
}
}

$right_sum=-9999;
$sum=0;
for($j=$mid;$j<count($arr);$j++)
{
$sum=$sum+$arr[$j];
if($sum>$right_sum)
{
$right_sum=$sum;
$right_k=$j;
}
}
//现在已经得到$left_sum $right_sum $left_k $right_k
$max_sum=$left_sum+$right_sum-$arr[$mid];
$retarr=array_slice($arr,$left_k,($right_k-$left_k+1));
return $retarr;
}
function find_max_arr($arr)
{
if(count($arr)<=1)
{
return $arr;
}
else
{
$mid=intval(count($arr)/2);
echo $mid;
$left_arr=find_max_arr(array_slice($arr,0,$mid));//左侧最大和数组

$right_arr=find_max_arr(array_slice($arr,$mid+1));//右侧最大和数组

$mid_arr=find_crossing_arr($arr);//跨越mid的最大和数组
if((array_sum($left_arr)>array_sum($right_arr))&&(array_sum($left_arr)>array_sum($mid_arr)))
{
return $left_arr;
}
elseif((array_sum($right_arr)>array_sum($left_arr))&&(array_sum($right_arr)>array_sum($left_arr)))
{
return $right_arr;
}
else
{
return $mid_arr;
}
}
}
var_dump(find_max_arr(array(1,2,3,4)));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: