/** * Searching maximum subarray inside given array * * @param array $a Array for sorting * @param integer $low left index, 0 by default * @param inreger $high right index, count($a) by default * @return array $new_arr left index, right index, maximal sum of element */ function maximum_subarray(array $a, $low = 0, $high = NULL) { if (count($a) == 0) { throw new Exception("Array is empty", 1); } if ($high === NULL) { $high = count($a) - 1; } if ($low == $high) { return array('low' => $low, 'high' => $high, 'sum' => $a[$low]); } $mid = intval(($low + $high) / 2); $left_arr = maximum_subarray($a, $low, $mid); $righ_arr = maximum_subarray($a, $mid + 1, $high); $cross_arr = max_crossing_subarray($a, $low, $mid, $high); if ($left_arr['sum'] >= $righ_arr['sum'] && $left_arr['sum'] >= $cross_arr['sum']) { return array('low' => $left_arr['low'], 'high' => $left_arr['high'], 'sum' => $left_arr['sum']); } elseif ($righ_arr['sum'] >= $left_arr['sum'] && $righ_arr['sum'] >= $cross_arr['sum']) { return array('low' => $righ_arr['low'], 'high' => $righ_arr['high'], 'sum' => $righ_arr['sum']); } else { return array('low' => $cross_arr['low'], 'high' => $cross_arr['high'], 'sum' => $cross_arr['sum']); } }
<?php /** * Searching maximum subarray inside given array behind linear time * * @package maximum_subarray * @author Andrey Babaev <*****@*****.**> */ require_once '../common/functions.php'; ini_set("memory_limit", "512M"); // Prepare test array $a = array(13, -3, -25, 20, -3, -16, -23, 0, 0, 0, 18, 20, -7, 12, -5, -22, 15, -4, 7); // Print array before sorting array_before($a); // Sort array $a = maximum_subarray($a); //Print array after sorting array_after($a); measure_exec_time_rand('maximum_subarray', 500000); measure_exec_time_rand('maximum_subarray', 1000000); measure_exec_time_rand('maximum_subarray', 1500000); /** * Searching maximum subarray inside given array behind linear time * * @param array $a Array for sorting * @return array $new_arr left index, right index, maximal sum of element */ function maximum_subarray(array $a) { $max_end = 0; $max_far = 0;