有一份5000万个用户的数据,有一份2亿个用户看电影的记录。只有1G的内存,找到看电影最多的前1000个用户?
应该怎么做呢?
我一开始的想法,哎呀,快速排序!把2亿个用户的数据提取出来放到5000万长度的数组里进行快速排序。把2亿个用户的数据提取出来,只能靠HashMap了,那么就要在建一个5000万个Key的HashMap了。但是想想只有1G的内存。
查找资料,在一个人博客中写到:1000000个item的HashMap就占内存接近60M了,那么5000万个item估计就要超过1个G了,因为HaspMap是非常非常消耗内存的。越是我的这个想法就宣告失败。
其实从思想上来看,我的这个想法只是暴力而已,用已经熟知的快速排序在时间上找点优势。然后看看题目,就知道他考你的不是时间,而是内存。我们都知道快速排序用的分而治之的思想,和这个思想相同的排序算法还有归并排序。
这个问题的正确解法应该是将2亿个记录分成一段段小的部分(可以用1G内存处理的部分),然后用我上面的方法进行排序,这样得出来每段的顺序,取前1000个,然后两两结合再次排序,或者三三结合也行。直到最后合并成一块,那就是我们需要的东西。
纵观下来,这就是归并排序的思想,也是分而治之的思想。在物理内存限制的情况下,我们只能局部求解,慢慢扩展到整体。这样可以用少的内存解决一个很庞大的问题。
如果这样的思想能在你的脑袋里扎根,那么很多问题你就可以解决了。