Я знаю, что этот вопрос старый, но так как нет никаких принятых ответов, и кажется, что это забавный вопрос - вот и мы!
Исходя из вашего вопроса, ваш алгоритм имеет Big O из O(10n)
, где n
- количество задач. Это означает, что это довольно эффективно по сравнению со многими вещами. Как уже указывалось, бинарное дерево поиска было бы быстрее с O(log(n))
, однако его реализация не стоила бы сэкономленного времени при обработке. Тем не менее, вы можете сделать его немного более эффективным и получить в результате O(n)
, используя что-то вроде:
$now = time();
$oneDay = 86400; //60 * 60 * 24
foreach($tasks as $task) {
//assuming now that $task is the timestamp of the task
//extra paranthesis added for easier reading
$dif = $now - ($oneDay * ceil(($now - $task) / $oneDay));
$data_points[$dif]++;
}
Математика в diff следующая. $now-$task
- это разница между двумя временными метками в секундах, которую мы делим на $oneDay
, чтобы получить количество дней в прошлом, в течение которых выполнялась задача. Теперь, предполагая, что $now
является началом нового дня, и если событие произошло всего 12 часов назад, оно было «вчера», мы используем ceil
, чтобы округлить его до следующего целого числа, чтобы «.5» стало «1». ». Оттуда мы умножаем на $oneDay
, чтобы получить количество секунд прошедших дней - для работы с ранее созданным массивом $data_points
. Затем мы берем этот результат и вычитаем его из $now
, снова для работы с вашим массивом $data_points
. Этот результат дает нам временную отметку, которую мы можем использовать, которая совпадает с отметкой в созданном вами массиве, и мы используем ее как «ключ» для нее и увеличиваем ее соответственно.
Это избавит вас от необходимости перебирать весь массив $data_points
для каждой задачи и, таким образом, уменьшит его сложность с O(10n)
до O(n)
.
В любом случае, я надеюсь, что ответ поможет объяснить, почему ваша формула не настолько неэффективна, но показывает, как сделать ее немного более эффективной.