php不适合处理大数据 php yield 处理大数据( 五 )


扩展:双堆 , 一个最大堆与一个最小堆结合,可以用来维护中位数 。
问题实例:
1)100w个数中找最大的前100个数 。
用一个100个元素大小的最小堆即可 。
5.双层桶划分 ----其实本质上就是【分而治之】的思想,重在“分”的技巧上!
适用范围:第k大,中位数 , 不重复或重复的数字
基本原理及要点:因为元素范围很大,不能利用直接寻址表,所以通过多次划分,逐步确定范围,然后最后在一个可以接受的范围内进行 。可以通过多次缩小 , 双层只是一个例子 。
扩展:
问题实例:
1).2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数 。
有点像鸽巢原理,整数个数为2^32,也就是,我们可以将这2^32个数,划分为2^8个区域(比如用单个文件代表一个区域),然后将数据分离到不同的区域,然后不同的区域在利用bitmap就可以直接解决了 。也就是说只要有足够的磁盘空间,就可以很方便的解决 。
2).5亿个int找它们的中位数 。
这个例子比上面那个更明显 。首先我们将int划分为2^16个区域 , 然后读取数据统计落到各个区域里的数的个数,之后我们根据统计结果就可以判断中位数落到那个区域 , 同时知道这个区域中的第几大数刚好是中位数 。然后第二次扫描我们只统计落在这个区域中的那些数就可以了 。
实际上,如果不是int是int64,我们可以经过3次这样的划分即可降低到可以接受的程度 。即可以先将int64分成2^24个区域,然后确定区域的第几大数,在将该区域分成2^20个子区域 , 然后确定是子区域的第几大数,然后子区域里的数的个数只有2^20 , 就可以直接利用direct addr table进行统计了 。
6.数据库索引
适用范围:大数据量的增删改查
基本原理及要点:利用数据的设计实现方法,对海量数据的增删改查进行处理 。
扩展:
问题实例:
7.倒排索引(Inverted index)
适用范围:搜索引擎,关键字查询
基本原理及要点:为何叫倒排索引?一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射 。
以英文为例 , 下面是要被索引的文本:
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" 将对应集合的交集 。
正向索引开发出来用来存储每个文档的单词的列表 。正向索引的查询往往满足每个文档有序频繁的全文查询和每个单词在校验文档中的验证这样的查询 。在正向索引中,文档占据了中心的位置,每个文档指向了一个它所包含的索引项的序列 。也就是说文档指向了它包含的那些单词,而反向索引则是单词指向了包含它的文档,很容易看到这个反向的关系 。
扩展:
问题实例:文档检索系统,查询那些文件包含了某单词,比如常见的学术论文的关键字搜索 。
8.外排序
适用范围:大数据的排序,去重
基本原理及要点:外排序的归并方法,置换选择 败者树原理 , 最优归并树
扩展:
问题实例:
1).有一个1G大小的一个文件 , 里面每一行是一个词,词的大小不超过16个字节,内存限制大小是1M 。返回频数最高的100个词 。
这个数据具有很明显的特点,词的大小为16个字节,但是内存只有1m做hash有些不够 , 所以可以用来排序 。内存可以当输入缓冲区使用 。

推荐阅读