Некоторые предложения по улучшению производительности:
Вместо:
for($k=0;$k<$d;$k++){
$median[$k] = $expenditure[$i+$k];
}
Использование:
$median = array_slice($expenditure, $i, $d);
В общем случае функции массива будут выполняться быстрее, чем циклы.
Другая отличная идея - снизить стоимость функции sort()
. Вы можете сделать это, поддерживая массив $median
, в основном отсортированный по всему. Таким образом, вместо того, чтобы брать срез каждый раз, вы нажимаете одно значение и извлекаете одно значение. Что-то вроде:
$median[$i+$d] = $expenditure[$i+$d]; // append a value
unset($median[$i]); // remove a value
Затем используйте asort
, чтобы отсортировать и поддерживать ассоциации ключей:
asort($median);
По сути, $median
всегда будет окном в $expenditure
размера d и поддерживает ключевые ассоциации. Вы можете инициализировать $median
с самого начала, сначала взяв срез, используя: $median = array_slice($expenditure, $i, $d);
вне цикла.
Очень грубо (сам не проверял):
function activityNotifications($expenditure, $d) {
$size = sizeof($expenditure);
$count = 0 ;
$median = array_slice($expenditure, 0, $d, TRUE); // initial slice with keys
for($i=$d;$i<$size;$i++){
$median[$i]=$expenditure[$i];
unset($median[$i-$d]);
asort($median);
$median_values = array_values($median);
if($d%2 == 1){
$middle = $median_values[floor($d/2)];
} else if($d%2 == 0){
$value = $d/2;
$middle = $median_values[$value] + $median_values[$value-1];
$middle = $middle/2;
}
$value = $middle*2;
if($value<=$expenditure[$d+$i]){
$count++;
}
}
return $count;
}
Обратите внимание, что приведенный выше код не будет работать напрямую, поскольку при извлечении значения средней точки ключи не будут в порядке. Таким образом, вам может понадобиться сначала использовать array_values
(я добавил это выше).