Алгоритм важности, основанный на времени

У меня есть массив пользователей, как показано ниже;

<?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 часов).

0 ответов

Другие вопросы по тегам