【最大子数组问题】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)));
<?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)));
相关文章推荐
- PHP实现求连续子数组最大和问题2种解决方法
- 求连续子数组最大和问题的两种解法_PHP实现
- 数组问题之一维最大字段和问题<Java实现>
- PHP数组数字键值的最大值问题
- 【面试题】有一个整数数组,求指定连续N个的和最大的子数组,PHP实现。
- 最大子数组问题-c++代码实现及运行实例结果
- 算法导论 4.1-5 最大子数组问题 线性时间算法 C++简单实现
- 一维数组及子数组最大和问题Java实现
- 第四章 最大子数组问题(股票最大收益) C++实现 算法导论
- 用分治法实现最大子数组问题(Java)
- 用暴力求解法和分而治之法求解最大子数组问题的Java代码实现
- 求一个数组中的最大值和最小值的算法改进 php 实现
- 算法导论C语言实现: 分治策略 -- 最大子数组问题
- 左神的书——《程序员代码面试指南》之生成窗口最大值数组问题c++实现
- 算法导论-最大子数组问题-线性时间复杂度算法分析与实现
- 求数组的子数组之和的最大值问题的实现
- 最大子数组问题及C语言实现
- 最大子数组问题实现
- 算法导论之最大子数组问题 C语言实现
- 最大子数组问题(三种方式,java实现)