• 一道数据处理的算法题


    有一份5000万个用户的数据,有一份2亿个用户看电影的记录。只有1G的内存,找到看电影最多的前1000个用户?

    应该怎么做呢?

    我一开始的想法,哎呀,快速排序!把2亿个用户的数据提取出来放到5000万长度的数组里进行快速排序。把2亿个用户的数据提取出来,只能靠HashMap了,那么就要在建一个5000万个Key的HashMap了。但是想想只有1G的内存。

    查找资料,在一个人博客中写到:1000000个item的HashMap就占内存接近60M了,那么5000万个item估计就要超过1个G了,因为HaspMap是非常非常消耗内存的。越是我的这个想法就宣告失败。

    其实从思想上来看,我的这个想法只是暴力而已,用已经熟知的快速排序在时间上找点优势。然后看看题目,就知道他考你的不是时间,而是内存。我们都知道快速排序用的分而治之的思想,和这个思想相同的排序算法还有归并排序。

    这个问题的正确解法应该是将2亿个记录分成一段段小的部分(可以用1G内存处理的部分),然后用我上面的方法进行排序,这样得出来每段的顺序,取前1000个,然后两两结合再次排序,或者三三结合也行。直到最后合并成一块,那就是我们需要的东西。

    纵观下来,这就是归并排序的思想,也是分而治之的思想。在物理内存限制的情况下,我们只能局部求解,慢慢扩展到整体。这样可以用少的内存解决一个很庞大的问题。

    如果这样的思想能在你的脑袋里扎根,那么很多问题你就可以解决了。

  • 相关阅读:
    汇编中push寄存器的影响
    windows lsp 指导
    java匹配中文汉字的正则表达式
    php中preg_match用户名正则实例
    Javascript中while和do-while循环用法详解
    如何找出MySQL数据库中的低效SQL语句
    asp.net连接oracle的问题及方法总结
    asp.net运算符之逻辑运算符以及其他运算符
    用命令行将Java程序打包为jar文件
    php 中cookie和session的用法比较
  • 原文地址:https://www.cnblogs.com/dacc123/p/8926632.html
Copyright © 2020-2023  润新知