Алгоритм важности, основанный на времени
У меня есть массив пользователей, как показано ниже;
<?php
$users = array(
array(
"id" => 1,
"last_updated" => 1398933140,
"weight" => 2.0
),
array(
"id" => 2,
"last_updated" => 1398933130,
"weight" => 0
),
array(
"id" => 3,
"last_updated" => 1398933120,
"weight" => 1.0
),
array(
"id" => 4,
"last_updated" => 1398933110,
"weight" => 0
)
);
?>
Я хочу (асинхронно) обновить некоторые статистические данные о пользователях (для которых я использую crobjob), заказанных на last_updated
По сути, пользователь с самой несвежей статистикой.
Тем не менее, я хочу добавить веса для пользователей и вычислить их в уравнении. Достаточно ли просто преобразовать вес в некоторое количество секунд и вычесть это из last_updated
Отметка времени?
Я знаю, что мой примерный массив имеет разницу во времени в 10 секунд, но я хочу начать добавлять критерии веса только после 3600 секунд.
// Start substracting weight
if ($timediff > 3600) {
// The longer the timediff, the heavier the weight becomes
$weight_severity = (($timediff/1000) * $weight) * SOME_CONSTANT;
// Putting the 'last_updated' back farther in the past
$substract = $timestamp - $weight_severity;
}
Это хороший "алгоритм" или он пойдет ужасно неправильно, когда различия станут довольно большими?
На данный момент у меня около 2000 пользователей (ожидается, что их станет 10.000), поэтому теоретически полный цикл занимает 2000 минут. Меня беспокоит, будет ли пользователь с весом 2.0
быть похороненным под 500 "незначительными" пользователями?
Обновление: я немного улучшил свой код.
<?php
$users = array(
array(
"id" => 1,
"last_updated" => 1399281955,
"weight" => 2.0
),
array(
"id" => 2,
"last_updated" => 1399281955 - 15000,
"weight" => 0
),
array(
"id" => 3,
"last_updated" => 1399281955 - 30000,
"weight" => 1.0
),
array(
"id" => 4,
"last_updated" => 1399281955 - 45000,
"weight" => 0
)
);
$results = array();
foreach ($users as $index => $user) {
$factor = 3;
$timestamp = $user['last_updated'];
$substract = $timestamp;
// Start substracting weight
$timediff = time() - $timestamp;
if ($timediff > 3600) {
// The longer the timediff, the heavier the weight becomes
$weight_severity = pow((($timediff/1000) * $user['weight']), $factor);
// Putting the 'last_updated' back farther in the past
$substract = $timestamp - $weight_severity;
}
$users[$index]['weight_updated'] = floor($substract);
$users[$index]['timediff'] = $timediff;
$users[$index]['diff'] = $users[$index]['last_updated'] -
$users[$index]['weight_updated'];
}
echo '<pre>';
print_r($users);
usort($users, function($a, $b) {
return (($a['weight_updated'] == $b['weight_updated'])) ?
0 : ($a['weight_updated'] < $b['weight_updated']) ? -1 : 1;
});
print_r($users);
Таким образом, без весов идентификаторы пользователей будут: 4,3,2,1
, Но с моим "алгоритмом" теперь 3,4,2,1
, Идентификатор пользователя 3
из-за его веса, делается раньше 4
, Это с разницей во времени 15000 секунд (чуть более 4 часов).