【问题标题】:Continuous monitoring and updating of popularity of items持续监控和更新物品的流行度
【发布时间】:2015-09-09 13:07:58
【问题描述】:

假设我们有1000 项目和一个地方,可以一次向访问用户显示这些项目中的任何十个。我们可以捕获点击率和一起显示的项目。

  1. 我们如何才能以最佳方式从这些项目中获得最流行的项目(比如 10)?
  2. 我们如何才能不断更新流行度并展示最佳的10 商品?

编辑:我正在寻找不同的方法而不是实现。

【问题讨论】:

  • 维护一个max heap。它应该可以工作。
  • 您能详细说明一下吗?对不起,无知。
  • 哪个操作发生的频率更高?重新排序还是 view-top-10?如果视图操作占主导地位,您希望按排序顺序维护项目(例如 BST)。如果重新排序占主导地位,您可能愿意在 top-10 操作上产生更多开销,以换取更便宜的重新排序操作(查看不同的最大堆实现)。

标签: algorithm e-commerce recommendation-engine


【解决方案1】:

如果你真的想把它压低,有一种愚蠢/简单的方法适合你的情况(显示前 1%)。

之所以会发生这种优化,是因为平均而言,100 次流行度变化中只有 1 次会淘汰前 1% 的人。 (假设更新的随机分布。当然,对于更典型的幂律分布,这可能会更频繁地发生。)

  1. 对整个初始集合进行排序,

    • 在任何排序的数据结构(例如 BST)中只存储前 10 个
    • 存储#10的流行度得分(例如minVisiblePopularity)
  2. 然后随着集合中的每个后续流行度变化,与minVisiblePopularity进行比较。

    • 如果新的受欢迎程度高于minVisiblePopularity,请相应地更新前10 结构和minVisiblePopularity。
    • (或者如果旧的受欢迎程度较高,但新的受欢迎程度较低 - 例如前 10 名的项目被淘汰)。

这增加了极小的二叉搜索树(10 项)和原始变量的最小存储要求。然后,该树只需要在流行度变化淘汰之前的前 10 名之一时进行更新。

【讨论】:

【解决方案2】:

自行实现:

通过流行度维护有序数组和包含对流行度二叉树中相应项目的引用的哈希表。 因此,最后 10 个将是最受欢迎的项目,对它们的访问将是 O(M),其中 M 是要显示的项目数。

维护有序数组:

可以使用具有 log(N) 复杂度的自平衡二叉树来维护,其中 N 是元素的总数

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

作为一个实用的选择:

数据库可以用来存储物品,B-tree索引可以添加到流行度列; DBMS 将在此处进行必要的优化 https://en.wikipedia.org/wiki/Database_index

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    相关资源
    最近更新 更多