zoukankan      html  css  js  c++  java
  • 找到出现次数最多的数

    题目说明

    有一个包含20亿个全是32位整数的大文件,在其中找到出现次数最多的数。

       

    题目要求

    内存限制为2GB。

       

    实现思路

    想要在很多整数中找到出现次数最多的数,通常的做法是使用哈希表对出现的每

    一个数做词频统计,哈希表的key是某一个整数,value是这个数出现的次数。就本题来说,一共有20亿个数,哪怕只是一个数出现了20亿次,用32位的整数也可以表示其出现的次数而不会产生溢出,所以哈希表的key需要占用4B,value也是4B。那么哈希表的一条记录(key,value)需要占用8B。最极端的情况是20亿个数都不同,那么在哈希表中可能需要产生20亿条记录,大约为16GB内存。这样内存会不够用,所以一次性用哈希表统计20亿个数的办法是有很大风险的。

       

    解决办法是把包含20亿个数的大文件用哈希函数分成很多个小文件,根据哈希函数的性质,同一种数不可能被哈希到不同的小文件上。

       

    假设哈希函数设计的足够好,可以将数字*乎*均的散列到每个小文件上。假设散列到8个小文件上,理论上每个文件占用的内存正好是2GB。当然为了更稳妥起见,我们可以分成更多的小文件,比如16个,20个,40个甚至更多。假设我们这里选择散列到16个小文件上。

       

    接下来,我们计算得到16个小文件中各自出现次数最多的数,还有各自的次数统计。接下来只要选出这16个小文件各自的第一名中谁出现的次数最多即可。

       

    把一个大的集合通过哈希函数分配到多台机器中,或者分配到多个文件里,这种技巧是处理大数据面试题时最常用的技巧之一。但是到底分配到多少台机器、分配到多少文件,在解题时一定要确定下来。可能是在与面试官沟通的过程中由面试官指定,也可能是根据具体的限制来确定。

  • 相关阅读:
    css实现图像边框的样式
    css3 实现div靠右对齐
    将div水平,垂直居中的方式
    使用vue-cli可视化的方式创建项目后如何关闭ESLint代码检测
    清楚html和css标签自带默认样式
    vue动态请求到的多重数组循环遍历,取值问题,如果某个值存在则显示,不存在则不显示。
    python 编程
    python 错题集
    python+selenium页面自动化 元素定位实际遇到的各种问题(持续更新)
    使用Fiddle抓取IOS手机
  • 原文地址:https://www.cnblogs.com/shuzhiwei/p/11316614.html
Copyright © 2011-2022 走看看