PHP实现最大子数组算法,内存溢出,如何优化?

这是代码:

<?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

请问:是哪里导致的内存溢出。如何改进?

阅读 2.8k
3 个回答

if ($low === $high)
这里改成==
因为floor后是浮点数,造成永远不会恒等于。所以跳到下面死循环了。

https://3v4l.org/about 有说明其 php.ini 内 memory_limit = 64M,这你改不了,建议在自己的机器上跑,把这个值改大些。

我结果都跑出来了,结果有人先我一步
Array
(

[0] => 7
[1] => 10
[2] => 43

)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题