[Tartarus] Алгоритм для вычисления наиболее используемых записей

Yuri Bushmelev =?iso-8859-1?q?jay4mail_=CE=C1_gmail=2Ecom?=
Вс Янв 11 19:34:46 MSK 2009


В сообщении от Воскресенье 11 января 2009 Dmitriy M. Maslennikov написал(a):
> При создании графических инструментов управления Tartarus есть задача
> показать пользователю список наиболее часто используемых записей. Для
> меня задача вычисления такого списка показалась нетривиальной.
>
> Формулирую задачу:
>
> Пользователь время от времени использует элементы, которые можно
> идентифицировать числами. В некоторый момент времени возникает задача
> показать ему некоторое количество (например, 10) наиболее используемых
> в последнее время элементов, от сортированных по "используемости".
> Необходимо учитывать, число использований, устаревание информации об
> использовании во времени: элемент очень часто использовавшийся месяц
> назад не должен попасть в список, если имеется десяток использованных
> сегодня и т. п. факторы. При этом алгоритм должен быть достаточно
> быстрым - пользователь должен получать список на экране без заметных
> задержек (часть информации можно вычислять при старте программы, а
> затем только содержать эту информацию в актуальном состоянии)
>
> Какие будут соображения?

При первом использовании элемента добавляем его в список, где дополнительно 
храним timestamp последнего использования и кол-во использований. 
Соответственно, при следующем использовании увеличиваем счетчик и обновляем 
timestamp.

При выводе для сортировки используем функцию для выбора top-10, зависящую от 
времени последнего использования и счетчика. Пусть она 
возвращает "приоритет". Простейший пример - кол-во дней с момента 
последнего использования * 10 000 000 + кол-во использований. Правда, если 
элемент вчера использовали 10 000 011 раз, то он все равно обгонит всех 
сегодняшних, использованных по одному разу. Поэтому надо придумать что-то 
более умное, но тут бы теоретика надо :)

Периодически отдельным потоком (thread'ом) можно этот 
список "перетрахивать", дабы не хранить там кучу старья. Можно просто 
выбирать top-10 и удалять остальное. Ибо счетчик использования не 
уменьшается.

Вот как-то так :)

-- 
С уважением,
Бушмелев Юрий


Подробная информация о списке рассылки Tartarus