有100w个关键字,长度小于等于50字节(B)。用高效的算法找出 top10 的热词,并对内存的占用不超过1MB

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gochenguowei/article/details/82053468

昨天去面试 C++ 后台开发,给了一份笔试题,里面有道附加题:“有100w个关键字,长度小于等于50字节(B)。用高效的算法找出 top10 的热词,并对内存的占用不超过1MB”。刚开始看到这道题,我的第一反应觉得应该就是 大化小 的分而治之。然后给出的答案跟网上也差不多(回来之后百度的)。觉得还不错,所有记录下解决过程。

(1)先把100w 个关键字 hash 映射到小文件,根据题意,100w * 50B = 50M, 而内存只有 1M, 故可以搞一个 hash 函数 % 50, 分解成50 个小文件,当然关键字分布是不均匀的,故如果某个映射后的文件的数据大于 1M,需要添加到新的文件中。

(2)针对每个小文件依次运用 map(key, value) 完成每个 key 的 value 次数统计,后用堆找出每个小文件中 value 次数最大的 top 10。

(3)最后依次对每两个小文件的 top10 归并,得到最终的  top10。

展开阅读全文

没有更多推荐了,返回首页