有一个访问量非常大的新闻网站,我们希望将点击量排名 Top 10 的新闻摘要,滚动显示在网站首页 banner 上,并且每隔 1 小时更新一次。如果你是负责开发这个功能的工程师,你会如何来实现呢?
我的思路是这样子,
1,对每篇新闻摘要计算一个hashcode,并建立摘要与hashcode的关联关系,使用map存储,以hashCode为key,新闻摘要为值
2,按每小时一个文件的方式记录下被点击的摘要的hashCode
3,当一个小时结果后,上一个小时的文件被关闭,开始计算上一个小时的点击top10
4,将hashcode分片到多个文件中,通过对hashCode取模运算,即可将相同的hashCode分片到相同的文件中
5,针对每个文件取top10的hashCode,使用Map<hashCode,int>的方式,统计出所有的摘要点击次数,然后再使用小顶堆(大小为10)计算top10,
6,再针对所有分片计算一个总的top10,最后合并的逻辑也是使用小顶堆,计算top10
7,如果仅展示前一个小时的top10,计算结束
8,如果需要展示全天,需要与上一次的计算按hashCode进行合并,然后在这合并的数据中取top10
9,在展示时,将计算得到的top10的hashcode,转化为新闻摘要显示即可
老师,你讲的这些例子,我觉得对我的工作和学习很有帮助,于是我花了一个周末将这一章节,将你所讲的堆的应用示例,全部翻译成了代码,并做了相关的验证,感觉自己收获很多,我也将这块代码上传了github,欢迎老师你的指正,需要的同学,也可以一起交流,
1,合并有序小文件
https://github.com/kkzfl22/datastruct/tree/master/src/main/java/com/liujun/datastruct/heap/solution/margeSmailFile
2,高性能定时器的应用
https://github.com/kkzfl22/datastruct/tree/master/src/main/java/com/liujun/datastruct/heap/solution/highTimeSchedule
3,求topk
https://github.com/kkzfl22/datastruct/tree/master/src/main/java/com/liujun/datastruct/heap/solution/topK
4,求中位数
https://github.com/kkzfl22/datastruct/tree/master/src/main/java/com/liujun/datastruct/heap/solution/midnum
5 ,大文件的关键字的统计
https://github.com/kkzfl22/datastruct/tree/master/src/main/java/com/liujun/datastruct/heap/solution/bigFileTopN
展开