2015-09-09 3 views
1

Предположим, у нас есть 1000 предметов и место, где вы можете показать все десять из этих предметов за раз посетителю. Мы можем фиксировать скорость клика и элементы, которые показаны вместе.Непрерывный мониторинг и обновление популярности предметов

  1. Как мы можем оптимально получить самые популярные предметы (скажем 10) из этих?
  2. Как мы можем постоянно обновлять популярность и показывать оптимальные пункты 10?

Редактировать: Я ищу различные подходы вместо реализаций.

+0

Поддержание «максимальной кучи». Он должен работать. – Haris

+0

Можете ли вы уточнить? Извините за невежество. – Appy

+0

Какая операция происходит чаще? Изменение порядка или вид сверху-10? Если доминирует представление, вы хотите сохранить элементы в отсортированном порядке (например, BST). Если переупорядочение доминирует, вы можете пойти на дополнительные расходы на топ-10 в обмен на более дешевую операцию переупорядочения (посмотрите на различные реализации макс-кучи). –

ответ

0

Само реализовано:

Чтобы поддерживать упорядоченный массив по популярности и хэш-таблицы, которые содержат ссылки на соответствующий пункт в популярности двоичного дерева. Итак, последние 10 самых популярных предметов, доступ к ним будет O (M), где M - количество элементов для показа.

Чтобы сохранить упорядоченный массив:

Это может поддерживаться с помощью самобалансирующегося бинарного дерева с лог (N) сложностью, где N представляет общее количество элементов

http://www.sitepoint.com/data-structures-2/

В качестве практического варианта :

база данных может использоваться для хранения товаров, а индекс B-дерева может быть добавлен в колонку популярности; СУБД будет нуждаться в оптимизации здесь. https://en.wikipedia.org/wiki/Database_index

1

Если вы действительно хотите сжать это, на ваш случай есть немой/простой подход (показать сверху 1%).

Эта оптимизация может произойти, потому что в среднем только 1 из 100 изменений популярности выбивает один из лучших 1%. (Предполагает случайное распределение обновлений. Конечно, с более типичным распределением степенным, это может произойти гораздо чаще.)

  1. Сортировать весь первоначальный сбор,

    • Храните только 10 лучших в любой сортированной структуре данных (например, BST)
    • Храните оценку популярности № 10 (например, minVisiblePopularity)
  2. затем с каждой последующей изменением популярности в коллекции, сравните с minVisiblePopularity.

    • Если новая популярность падает выше minVisiblePopularity, обновить структуру и minVisiblePopularity топ-10 соответственно.
    • (Или, если старая популярность была больше, но новая популярность меньше - например, бывший топ-10 предметов, получающих нокаут).

Это добавляет минимальное требование хранения чрезвычайно малого двоичного дерева поиска (10 единиц) и примитивной переменной. Дереву тогда требуется только обновление, когда изменение популярности выбивает один из предыдущих топ-10.

+0

Только что увидели более ранний ответ по этим строкам для [Какая лучшая структура данных для хранения верхних элементов в порядке сортировки?] (Http://stackoverflow.com/questions/14969909/what-is-the-best-data -структура для хранения-the-top-n-elements-in-sort-order # 14986415) (с обсуждением) –

Смежные вопросы