这是代码:
<?php
function findMaxCrossingSubarray(&$A, $low, $mid, $high){
$leftSum = -PHP_INT_MAX;
$sum = 0;
for($i = $mid; $i >= $low; $i--) {
$sum = $sum + $A[$i];
if ($sum > $leftSum) {
$leftSum = $sum;
$maxLeft = $i;
}
}
$rightSum = -PHP_INT_MAX;
$sum = 0;
for($j = $mid + 1; $j <= $high; $j++) {
$sum = $sum + $A[$j];
if ($sum > $rightSum) {
$rightSum = $sum;
$maxRight = $j;
}
}
return [
$maxLeft,
$maxRight,
$leftSum + $rightSum,
];
}
function findMaximumSubarray(&$A, $low, $high) {
if ($low === $high) {
return [
$low,
$high,
$A[$low],
];
} else {
$mid = floor(($low + $high) / 2);
list($leftLow, $leftHigh, $leftSum) = findMaximumSubarray($A, $low, $mid);
list($rightLow, $rightHigh, $rightSum) = findMaximumSubarray($A, $mid + 1, $high);
list($crossLow, $crossHigh, $crossSum) = findMaxCrossingSubarray($A, $low, $mid, $high);
if ($leftSum >= $rightSum && $leftSum >= $crossSum) {
return [
$leftLow,
$leftHigh,
$leftSum,
];
} else if ($rightSum >= $leftSum && $rightSum >= $crossSum) {
return [
$rightLow,
$rightHigh,
$rightSum,
];
} else {
return [
$crossLow,
$crossHigh,
$crossSum,
];
}
}
}
$A = [13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7];
print_r(findMaximumSubarray($A, 0, 15));
执行结果:
Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 262144 bytes) in /in/A3dLe on line 38
Process exited with code 255.
在线运行demo:https://3v4l.org/A3dLe
请问:是哪里导致的内存溢出。如何改进?
if ($low === $high)
这里改成==
因为floor后是浮点数,造成永远不会恒等于。所以跳到下面死循环了。