海量数据处理~
来源:互联网 发布:尘埃落定 知乎 编辑:程序博客网 时间:2024/06/07 03:42
海量数据,意思就是数据数量大,一般来说呢,就可以考虑哈希算法~
那么,哈希算法是什么嘞?它也叫做散列函数,顾名思义,把一组数据散列开,常用的方法就是模值取余法,例如,一组数据{0,1,2,3,4,5,6,7},可以散列成两组,模2得0的和模2得1的{0,2,4,6},{1,3,5,7};
OK,言归正传,说海量数据的事~
一、经典思路:分而治之/hash映射 + hash统计 + 堆/快速/归并排序
举个例子叭~
例1、海量日志数据,提取出某日访问百度次数最多的那个IP。
简单粗暴的方案1:众所周知,IP是32位的,那也就是说,IP一共会有2^32种情况,直接分配一个2^32的内存,然后进行模上2^32,再进行哈希统计。
心思缜密的方案2:
很多问题都可以套路方案2呢,总之记住一点,分组一定得保证相同的在一个组里,不然没办法统计。还有一个小点,如果不是整型,而是字符串呢,总不好直接模整型吧,解决办法:
(1)字符串的ASCII值相加。例如呢,"abc" = 97+ 98+ 99;
(2)字符串的ASCII值乘以系数相加,例如呢,"abc" = 97*(2^2)+ 98*(2^1)+ 99*(2^0);
例2:给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
还是采用经典思路的方法,但是不同的是,两个文件采用相同的哈希映射法(即模的数要相同),相同的余数组成一对,进行哈希统计即可。
二、Bloom filter/Bitmap
1、Bloom filter【布隆过滤器】:优点是利用正确率换取时间和空间,用在“找寻一个数字是否在这个数列里”这种查重问题特别方便。
2、基本思想:多个哈希函数一起映射。
3、给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
基本原理及要点:一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。
以英文为例,下面是要被索引的文本:
T0 = "it is what it is";
T1 = "what is it";
T2 = "it is a banana";
我们就能得到下面的反向文件索引:
"a": {2}
"banana": {2}
"is": {0, 1, 2}
"it": {0, 1, 2}
"what": {0, 1}
检索的条件"what","is"和"it"将对应集合的交集。
- 海量数据处理
- 海量数据处理
- 海量数据处理
- 海量数据处理
- 海量数据处理
- 海量数据处理
- 海量数据处理
- 海量数据处理
- 海量数据处理
- 海量数据处理
- 海量数据处理
- 海量数据处理
- 海量数据处理
- 海量数据处理
- 海量数据处理
- 海量数据处理
- 海量数据处理
- 海量数据处理
- Android 三方登录
- c# android开发软件安装及环境配置
- 设计模式——观察者模式
- IntelliJ IDEA 的安装和破解
- HDU-6053 TrickGCD 前缀和数组,莫比乌斯函数
- 海量数据处理~
- 荀子 《劝学》
- loadrunner 在win10的那些事1
- 简单轮播图JS
- 【Java笔记】创建Class对象的三种常用办法和Class单例的测试
- 机器学习第二周--Multiple features & Normal equation
- 关于jquery的obj.click()、和obj.on()以及行内的onclick事件
- HDU1248 寒冰王座
- VSCode中emmet被自动提示覆盖问题