我想知道是否有一个算法来计算“最频繁的项目”而不必记住每个项目的数量?例如,假设我是一个搜索引擎,想要跟踪10个最受欢迎的搜索。我不想做的是保留每个查询的计数器,因为可能有太多的查询让我计算(而且大多数它们将是单例)。有一个简单的算法吗?也许是概率性的东西?谢谢!
答案 0 :(得分:4)
好吧,如果您有大量的查询(比如搜索引擎可能会这样),那么您可以对查询进行“抽样”。因此,您每秒可能会收到1,000个查询,但如果您只是每秒计数一次,那么在很长一段时间内,您将获得一个与“真实”答案相对接近的答案。
这就是“采样”分析器的工作原理。每隔 n 毫秒,它会查看当前正在执行的功能。在很长一段时间(几秒钟)内,您可以很好地了解“昂贵”的功能,因为它们更常出现在样品中。
你仍然需要做“计数”,但是通过定期抽样,而不是计算每一个查询,你可以得到你实际需要存储的数据量的上限(例如max每秒一个查询,等等)
答案 1 :(得分:2)
如果您希望在任何给定时间进行最频繁的搜索,则无需使用无限计数器跟踪提交的每个查询。相反,您需要一种算法来衡量任何给定查询的提交量除以设定的时间段。这是一个非常简单的算法。提交到您的搜索引擎的任何搜索,例如单词“缓存”,都会存储一段固定的时间,称为刷新率,(刷新率的长度取决于您的搜索引擎获得的流量类型和金额您希望跟踪的“最佳结果”)如果刷新率时间段到期并且搜索单词“cache”没有持久化,则查询被删除内存。如果搜索单词“cache”仍然存在,则您的算法只需要跟踪搜索单词“cache”的速率。为此,只需将所有搜索存储在“泄漏计数器”上。每个条目都会被推送到计数器上,并且过期日期将删除查询。您的活动计数器是您最常见查询的指标。
答案 2 :(得分:0)
存储每个查询都很昂贵,但是必须确保前10名实际上是前10名。你必须作弊。
一个想法是存储URL,命中计数器和按计数索引的时间戳,然后存储时间戳。当表达到任意接近最大大小时,开始删除超过给定天数的低端条目。虽然不会计算旧的,不常见的查询,但由于查询率较高,可能会排在前10位的查询应该会在桌面上进行查询。
另一个想法是为搜索查询编写一个16位(或更多)哈希函数。有一个包含计数器和URL的65536条目表。执行搜索时,递增相应的表条目并在必要时设置URL。然而,这种方法有一个主要缺点。垃圾邮件机器人可以像“廉价的伟哥”那样重复查询,可能会使合法查询增加垃圾邮件查询计数器,将邮件放在主页上。
答案 3 :(得分:0)
你想要一个缓存,其中有很多种;看维基百科 Cache algorithms和 Page replacement algorithm老龄化。