【问题标题】:Getting the most frequent items without counting every item获取最频繁的项目而不计算每个项目
【发布时间】:2011-02-15 19:06:18
【问题描述】:

我想知道是否有一种算法可以计算“最常见的项目”而不必对每个项目进行计数?例如,假设我是一个搜索引擎,想要跟踪 10 个最受欢迎的搜索。我不想做的是为每个查询保留一个计数器,因为我可能有太多查询无法计算(而且大多数都是单例)。有一个简单的算法吗?也许是概率性的东西?谢谢!

【问题讨论】:

  • 限制时间窗口并允许旧搜索从某种 MRU 列表的末尾消失怎么样?散列实际搜索字符串以提高比较效率。
  • Google 的“概率 top-k 查询”,应该让你走上正轨

标签: algorithm counting


【解决方案1】:

好吧,如果您有大量的查询(例如搜索引擎可能会这样),那么您可以对查询进行“抽样”。因此,您每秒可能会收到 1,000 个查询,但如果您只保持每秒一个计数,那么在较长的一段时间内,您会得到一个相对接近“真实”答案的答案。

这就是“采样”分析器的工作方式。每 n 毫秒它查看当前正在执行的函数。在很长一段时间(几秒钟)后,您会很好地了解“昂贵”的功能,因为它们是您的示例中出现频率更高的功能。

您仍然需要进行“计数”,但是通过定期采样,而不是计数每个查询,您可以获得实际必须存储的数据量的上限(例如最大每秒一个查询等)

【讨论】:

  • 当然你最好将它与滚动窗口混合,正如@Dane 在评论中所建议的那样:)
【解决方案2】:

如果您希望在任何给定时间进行最频繁的搜索,则无需使用无休止的计数器来跟踪每个提交的查询。相反,您需要一种算法来衡量任何给定查询的提交量除以设定的时间段。这是一个非常简单的算法。提交给您的搜索引擎的任何搜索,例如“缓存”一词,都会存储一段固定的时间,称为刷新率,(刷新率的长度取决于您的搜索引擎获得的流量类型和数量您想要跟踪的“最佳结果”)。如果刷新率时间段到期并且没有持续搜索“缓存”一词,则查询被删除内存。如果对“cache”这个词的搜索持续存在,你的算法只需要跟踪“cache”这个词被搜索的速度。为此,只需将所有搜索存储在“泄漏计数器”上。每个条目都被推送到具有到期日期的计数器上,之后查询将被删除。您的活动计数器是您的热门查询的指标。

【讨论】:

    【解决方案3】:

    存储每个查询会很昂贵,但必须确保前 10 名实际上是前 10 名。你必须作弊。

    一个想法是存储一个包含 URL、命中计数器和按计数索引的时间戳的表,然后是时间戳。当表达到某个任意接近最大的大小时,开始删除早于给定天数的低端条目。虽然不计算旧的、不常见的查询,但可能进入前 10 名的查询应该会出现在表中,因为查询速度更快。

    另一个想法是为搜索查询编写一个 16 位(或更多)的哈希函数。有一个包含计数器和 URL 的 65536 条目表。执行搜索时,增加相应的表条目并在必要时设置 URL。然而,这种方法有一个主要缺点。垃圾邮件机器人可能会重复查询,例如“便宜的伟哥”,可能会使合法查询增加垃圾邮件查询计数器,从而将它们的消息放在您的主页上。

    【讨论】:

      【解决方案4】:

      你想要一个缓存,它有很多种;见维基百科 Cache algorithmsPage replacement algorithm 老化。

      【讨论】:

        猜你喜欢
        • 2018-04-22
        • 2014-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-14
        • 1970-01-01
        • 1970-01-01
        • 2018-01-01
        相关资源
        最近更新 更多