update big data

This commit is contained in:
nonstriater
2015-12-13 20:39:33 +08:00
parent 0c68531509
commit 367fda9b81
3 changed files with 103 additions and 14 deletions
+8
View File
@@ -208,6 +208,14 @@ http://ac.jobdu.com/index.php 九度OJ
这有个ACM训练方案 http://www.java3z.com/cwbwebhome/article/article19/res041.html
### 其它
[高级数据结构和算法](https://www.coursera.org/learn/gaoji-shuju-jiegou/) 北大教授张铭老师在coursera上的课程。完成这门课之时,你将掌握多维数组、广义表、Trie树、AVL树、伸展树等高级数据结构,并结合内排序、外排序、检索、索引有关的算法,高效地解决现实生活中一些比较复杂的应用问题。当然coursera上也还有很多其它算法方面的视频课程。
[算法设计与分析 Design and Analysis of Algorithms](https://class.coursera.org/algorithms-001/lecture) 由北大教授Wanling Qu在coursera讲授的一门算法课程。首先介绍一些与算法有关的基础知识,然后阐述经典的算法设计思想和分析技术,主要涉及的算法设计技术是:分治策略、动态规划、贪心法、回溯与分支限界等。每个视频都配有相应的讲义(pdf文件)以便阅读和复习。
## 补充:C语言代码规范
+2 -4
View File
@@ -60,12 +60,10 @@ SVM
学好python
coursera公开课
Andrew Ng
[Machine learning](https://www.coursera.org/learn/machine-learning/) Andrew Ng 在 coursera公开课
http://julyedu.com/course/getDetail?course_id=34#discard julyedu 课程大纲
[julyedu 课程大纲](http://julyedu.com/course/getDetail?course_id=34#discard)
### 数据挖掘
+93 -10
View File
@@ -10,10 +10,10 @@
* Hash映射/分而治之
* Bitmap
* Bloom filter(布隆过滤器)
* 双层桶划分
* Trie树
* 数据库索引
* 倒排索引(Inverted Index)
* 双层桶划分
* 外排序
* simhash算法
* 分布处理之Mapreduce
@@ -76,7 +76,7 @@ for (int i=0;i<s.length();i++){
比如,某文件中有若干8位数字的电话号码,要求统计一共有多少个不同的电话号码?
分析:8位最多99 999 999, 如果1Byte表示1个号码,需要95MB空间,但是如果1bit表示1个号码,则只需要 95/8=12MB 的空间。这时,数字k(0~99 999 999)与bit位的对应关系是:
分析:8位最多99 999 999, 如果1Byte表示1个号码是否存在,需要95MB空间,但是如果1bit表示1个号码是否存在,则只需要 95/8=12MB 的空间。这时,数字k(0~99 999 999)与bit位的对应关系是:
```
#define SIZE 15*1024*1024
@@ -179,6 +179,68 @@ http://blog.csdn.net/jiaomeng/article/details/1495500
http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html `哈希函数个数k、位数组大小m` 测试论证
### 双层桶划分
双层桶不是一种数据结构,只是一种算法思维。分而治之思想。
当我们有一大推数据需要处理时,局限于各种资源限制(主要说内存)不能一次处理完成,这是需要将一大堆数据分成多个小段数据。通过处理各个小段数据完成最终任务。
双层这里是虚指,并不是一定把数据分成2份,也可能多份。比如下面几个问题:
1. 2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。
2. 5亿个int找它们的中位数
第一个问题,2.5亿(2^32=4,294,967,296)个数,我们将这2^32个数分到2^8=256个区域(文件中)。每个文件中的平均数字个数差不多 2^24个(1千7百万个)。
0~2^24 第一个文件,2^24~2^25第二个文件
假设32位机,装下这些数字需要的内存是 2^24*4=2^26=64MB,也可以不用将文件一次性读入内存而是采用流式读取。
然后对每个文件使用bitmap处理,每2bit(2-bitmap)表示一个整数,00表示整数未出现,01表示出现一次,10表示出现两次及其以上。这样,每个文件2^24个数字,最大数2^32/(8/2)=2^30=1GB内存
这个问题倒是更新是bitmap的应用,没有很好体现双层桶分治的优势。
第二个问题,首先我们将int划分为2^16个区域,然后读取数据统计落到各个区域里的数的个数,之后我们根据统计结果就可以判断中位数落到那个区域,同时知道这个区域中的第几大数刚好是中位数。然后第二次扫描我们只统计落在这个区域中的那些数就可以了。
适用问题领域是:`top-k,中位数,不重复或重复的数字`
### 外排序
对磁盘文件的排序。将待处理的数据不能一次装入内存,先读入部分数据排序后输出到临时文件,采用「排序-归并」的策略。在归并阶段将这些临时文件组合为一个大的有序文件,也即排序结果。
`多路归并`,`最小堆`
比如,要对900 MB的数据进行排序,但机器上只有100 MB的可用内存时,外归并排序按如下方法操作:
1. 读入100 MB的数据至内存中,用某种常规方式(如快速排序、堆排序、归并排序等方法)在内存中完成排序。
2. 将排序完成的数据写入磁盘。
3. 重复步骤1和2直到所有的数据都存入了不同的100 MB的块(临时文件)中。在这个例子中,有900 MB数据,单个临时文件大小为100 MB,所以会产生9个临时文件。
4. 读入每个临时文件(顺串)的前10 MB( = 100 MB / (9块 + 1))的数据放入内存中的输入缓冲区,最后的10 MB作为输出缓冲区。(实践中,将输入缓冲适当调小,而适当增大输出缓冲区能获得更好的效果。)
5. 执行`九路归并`算法,将结果输出到输出缓冲区。一旦输出缓冲区满,将缓冲区中的数据写出至目标文件,清空缓冲区。一旦9个输入缓冲区中的一个变空,就从这个缓冲区关联的文件,读入下一个10M数据,除非这个文件已读完。这是“外归并排序”能在主存外完成排序的关键步骤 -- 因为“归并算法”(merge algorithm)对每一个大块只是顺序地做一轮访问(进行归并),每个大块不用完全载入主存。
为了增加每一个有序的临时文件的长度,可以采用`置换选择排序`(Replacement selection sorting)。它可以产生大于内存大小的顺串。具体方法是在内存中使用一个`最小堆`进行排序,设该最小堆的大小为M。算法描述如下:
1. 初始时将输入文件读入内存,建立最小堆。
2. 将堆顶元素输出至输出缓冲区。然后读入下一个记录:
* 若该元素的关键码值不小于刚输出的关键码值,将其作为堆顶元素并调整堆,使之满足堆的性质;
* 否则将新元素放入堆底位置,将堆的大小减1。
3. 重复第2步,直至堆大小变为0。
4. 此时一个顺串已经产生。将堆中的所有元素建堆,开始生成下一个顺串。[3]
此方法能生成平均长度为2M的顺串,可以进一步减少访问外部存储器的次数,节约时间,提高算法效率。
### Trie树
字典树,英文名Trie树,Trie一词来自retrieve,发音为/tri:/ “tree”,也有人读为/traɪ/ “try”,
@@ -308,6 +370,8 @@ trie树的增加和删除都比较麻烦,但索引本身就是写少读多,
* 敏感词过滤
### 数据库索引
索引使用的数据结构多是B树或B+树。B树和B+树广泛应用于文件存储系统和数据库系统中,mysql使用的是B+树,oracle使用的是B树,Mysql也支持多种索引类型,如b-tree 索引,哈希索引,全文索引等。
@@ -443,14 +507,14 @@ B树和B+树的区别在于:
### 倒排索引(Inverted Index)
也叫反向索引。是文档检索系统中最常用的数据结构。常规的索引是文档到关键词的映射,如果对应的文档是
[Elasticsearch](https://github.com/elastic/elasticsearch)就是使用倒排索引(inverted index)的结构来做快速的全文搜索。ElasticSearch 不仅用于全文搜索, 还有非常强大的统计功能 (facets)。
携程,58,美团的分享中都提到ES构建实时日志系统,帮助定位系统问题。
@@ -458,12 +522,6 @@ B树和B+树的区别在于:
[Elasticsearch权威指南](http://es.xiaoleilu.com/index.html)
### 双层桶划分
### 外排序
@@ -476,10 +534,35 @@ B树和B+树的区别在于:
### 分布处理之Mapreduce
MapReduce是Google提出的一个软件架构,用于大规模数据集(大于1TB)的并行运算。概念“Map(映射)”和“Reduce(归纳)”,及他们的主要思想,都是从函数式编程语言借来的,还有从矢量编程语言借来的特性。MapReduce的伟大之处就在于让不熟悉并行编程的程序员也能充分发挥分布式系统的威力。
##### Mapreduce工作原理
举一个例子:10年内所有论文(当然有很多很多篇)里面出现最多的几个单词。
我们把论文集分层N份,一台机器跑一个作业。这个方法跑得快,但是有部署成本,需要把程序copy到别的机器,要把论文分N份,且还需要最后把N个运行结果整合起来。这其实就是Mapreduce本质。
map函数和reduce函数是交给用户实现的,这两个函数定义了任务本身。
* map函数:接受一个键值对(key-value pair),产生一组中间键值对。MapReduce框架会将map函数产生的中间键值对里键相同的值传递给一个reduce函数。Map操作是可以高度并行的。
* reduce函数:接受一个键,以及相关的一组值,将这组值进行合并产生一组规模更小的值(通常只有一个或零个值)。
##### Hadoop
谷歌技术有"三宝",GFS、MapReduce和大表(BigTable)。
Hadoop实际上就是谷歌三宝的开源实现,Hadoop MapReduce对应Google MapReduce,HBase对应BigTable,HDFS对应GFS。HDFS(或GFS)为上层提供高效的非结构化存储服务,HBase(或BigTable)是提供结构化数据服务的分布式数据库,Hadoop MapReduce(或Google MapReduce)是一种并行计算的编程模型,用于作业调度。
Hadoop 使用java实现。