Не помещайте идентификатор в выбранную часть запроса
String query ="SELECT tbl_Date as Date, Flat, Mobile, Food, Alcohol, Transport,
Outdoor, Pauls_stuff, Income, Stuff FROM finance.fin";
Некоторые предложения по улучшению производительности:
Вместо:
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
размера г и поддерживает ключевые ассоциации. Вы можете инициализировать $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
(я добавил это выше).
Поскольку $d
действует как константа в этой функции, общее улучшение заключается в извлечении фиксированных данных вне цикла.
Важная часть, я думаю, - объявить $median
один раз и использовать его повторно, это может уменьшить некоторые издержки GC.
function activityNotifications($expenditure, $d)
{
$size = sizeof($expenditure);
$count = 0 ;
$median = array_fill(0, $d, 0); #create an array with predefined size
$d_divide_by_2 = $d/2;
$d_divide_by_2_int = floot($d_divide_by_2);
if($d%2 == 1)
{
for($i=0;$i<$size-$d;$i++)
{
for($k=0;$k<$d;$k++)
{
$median[$k] = $expenditure[$i+$k];
}
sort($median);
$value = $median[$d_divide_by_2_int]*2;
if($value<=$expenditure[$d+$i]){
$count++;
}
}
}
else
{
for($i=0;$i<$size-$d;$i++)
{
for($k=0;$k<$d;$k++)
{
$median[$k] = $expenditure[$i+$k];
}
sort($median);
$value = $median[$d_divide_by_2] + $median[$d_divide_by_2-1];
if($value<=$expenditure[$d+$i]){
$count++;
}
}
}
return $count;
}