博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
大量数据的问题
阅读量:5212 次
发布时间:2019-06-14

本文共 891 字,大约阅读时间需要 2 分钟。

这些问题一般有着内存限制,使用hashmap和位图解决不实际。

1.只用2GB内存在20亿个整数中找到出现次数最多的数?

将20亿个整数的大文件用hash函数分为16小文件(这个时候同一个数一般分到了同一个小文件上,小文件的数最好不要超过2亿),这个时候每个小文件用hash函数计算出现次数,这个时候得到16个数为各自文件下出现最多,再比较得到这16个数出现最多的那个,就是我们想要的。

2.40亿个非负整数中找到没出现的数?

32位无符号整数的范围是0-4294967295,存在于一个文件上,最多使用一个G的内存(所有不出现的数),或者说限制为10m的内存(一个未出现的数)。
好比将他们分了64个区间,一个区间应该有67108864,将这个些数遍历,先申请一个长度64的整数数组,统计在区间i 上的个数,遍历完之后,再遍历区间数组,少于67108864的拿出来找缺失的j,接着做67108864的位图数组,再遍历一遍0-4294967295,不在区间j的忽略,没有置1的自然就是缺失了,这时要找的是67108864*i+j。

3.找到100亿个URL中重复的URL以及搜索词汇的topK问题?

这个都是建立在数据量很大的情况下,一般做法划分小文件或多个机器上,就是通过哈希函数来划分,能保证相同的数据放到相同的机器或文件上,然后在小文件或机器上使用哈希函数统计,小根堆排序top100,然后把不同机器的top100进行外排序或继续使用小根堆。

4.40亿个非负整数中找到出现次数两次的数和所有数的中位数?

如果有1G的内存,就开个大位图数组长度为80亿,第一遇到num就见bitArr[num*2+1]和bitArr[num*2]设置01,下一次10,第三次或多次都是11,这个遍历bitArr时10的就是要找的,如果在内存上有限制的话,就要分区间处理。找中位数也如果,分区间处理,通过累加每个区间的出现的次数,找到中位数落在那个区间,再对这个区间做词频统计。

转载于:https://www.cnblogs.com/ljy-1471914707/p/7840491.html

你可能感兴趣的文章
Java编程思想总结笔记Chapter 5
查看>>
[LeetCode]662. Maximum Width of Binary Tree判断树的宽度
查看>>
WinForm聊天室
查看>>
Python 从零学起(纯基础) 笔记(一)
查看>>
【Python学习笔记】1.基础知识
查看>>
梦断代码阅读笔记02
查看>>
Java 线程安全问题
查看>>
selenium学习中遇到的问题
查看>>
大数据学习之一——了解简单概念
查看>>
P1-13:集成日志组件 logback 2彩色日志
查看>>
Linux升级内核教程(CentOS7)
查看>>
Lintcode: Partition Array
查看>>
分享适合个人站长的5类型网站
查看>>
类别的三个作用
查看>>
【SICP练习】85 练习2.57
查看>>
runC爆严重安全漏洞,主机可被攻击!使用容器的快打补丁
查看>>
Maximum Product Subarray
查看>>
solr相关配置翻译
查看>>
通过beego快速创建一个Restful风格API项目及API文档自动化(转)
查看>>
解决DataSnap支持的Tcp长连接数受限的两种方法
查看>>