海量数据处理

来源:互联网 发布:2016淘宝宝贝图片尺寸 编辑:程序博客网 时间:2024/04/28 15:18

1. heap sort与median of median quick sort

[问题]空间有N个点,如何求出离点p0最近的K个点?

[答案1]首先当然是算出各点到p0的距离。一边算一边构造一个K大小的max heap(这里heap是堆排序中的heap的意思)。heap满了以后每次把max挤出堆。复杂度N*logK.

[答案2]在CLRS的书《Introduction to Algorithms》的第9.3章,介绍了一个把数组分成5个5个的小区间,用median of median quick sort, 可以用O(N)得到第K大元素,再走一遍挑出前K大就好了,总复杂度还是O(N).

思考:双堆,一个最大堆与一个最小堆结合,可以用来维护中位数

[问题] 10亿个数如何求前1000大

min heap

[问题] 很多数求前两大

这个简单地用tournament方法,淘汰赛,n+logn-2
logn是因为要在和冠军比过的里面二分查找
需要给一个败者队列
http://www.cis.ysu.edu/~kramer/CSCI5870/Adversary/SecondLargest.pdf

2. divide and conquer

[问题]10亿个整数,找它的中位数

把整数区间划分成2^16个小区间,统计落到各个区间的数目。这样能知道中位数落在哪个区间,以及应该是该区间的第几大数。再把该区间里的数映射到一个counting bitmap(这是前文里讲的数据结构)里面去,就能数出中位数

3. trie tree

4. external sort

5. inverted index

Question: Given a document and a query of K words, how do u find the smallest window that covers all the words at least once in that document? (given you know the inverted lists of all K words, that is, for each word, you have a list of all its occurrrences). This one is really hard. Could someone propose an algorithm in O(n)?

Example: Suppose the document is Z A Y B C X Z D E F Y G, and you want to find smallest window of XYZ. The inverted index list is X = {5}, Y = {2, 10}, Z = {0, 6}
The total number of windows is the product 1 x 2 x 2 = 4. They are (5, 2, 0)-> size 6,
(5, 2, 6) -> size 5, (5, 10, 0) -> size 6, (5, 10, 6) -> size 6. The smallest window is (5, 2, 6) i.e. from 2 (Y) to 6 (Z) -> "Y B C X Z".

As all the inverted lists are sorted, lets suppose there are k of them.
Now build a min-heap with the first index of all the k lists and also keep track of the max element. Now check the value of max - min and store it.
Now keep reading the indexes from each list, and check if its index > min value, then insert it into the heap and pop the min element. Keep doing this till you exhaust elements in one of the lists.

6. Treap

按BST基本性质插入,生成修正值(有人叫优先级、附加值、堆权值),并按照最大堆序维护修正码。
向左子树插入返回后
如果左子修正值大于根修正值,堆序被破坏,将根旋转到右子树(右旋)
向右子树插入返回后
如果右子修正值大于根修正值,堆序被破坏,将根旋转到左子树(左旋)

删除:
叶节点:直接删除
链节点:链接上子节点并删除
完全节点:
若其左子树修正值较小,将该节点左旋,递归删除左节点
若其右子树修正值较小,将该节点左旋,递归删除右节点

左旋:将根X旋转到左子树

Y=X右子
X右子=Y左子
Y左子=X
X=Y

右旋:将根X旋转到右子树

Y=X左子
X左子=Y右子
Y右子=X
X=Y

一个非常棒的Treap演示
http://www.ibr.cs.tu-bs.de/courses/ss98/audii/applets/BST/Treap-Example.htm

 

7. Young Tableau: 一个nxm的matrix,每一行,每一列都是递增的,现找第k大个数,要求时间复杂度低于
O(mn)
在young tableaux中找第K大元素可以参考在heap中找第k大元素,因为young tableaux
和heap有些类似.
while (count <k ) {
  e = table.remove_min();
  table.youngify(); //去掉最小元素后,调整结构以保持young tabuleaux特性,
  count++;
}
return e;
  youngify()与heapify()类似,通过shift元素来保持young tabuleaux特性, 其实现
可参考http://lyle.smu.edu/~saad/courses/cse3358/ps5/problemset5sol.pdf
  for a table (m, n), youngify() 的复杂度:at most (m+n)

8. String matching

KMP

9. Sorted arrays M and N with len m and n, find intersection of them. Then ask
if m >> n, how to do it.
(1) merge sort的思想,需要顺序读入大文件, O(m+n)。
(2) 对小文件里每一个element,到大文件里binary search. 理论上是O(nlogm).
    当 m >> n, (2)更好。但是binary search时还是要读入大文件的很多block,
   所以有(3)
(3) B-tree,这样只要读入大文件的一个block if B-tree在内存的话。

 

思考题(来自bbs.xjtu.edu.cn):

1. 给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。
2. 有10个文件,每个文件1G, 每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。要你按照query的频度排序
3. 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16个字节,内存限制大小是1M。返回频数最高的100个词
4.海量日志数据,提取出某日访问百度次数最多的那个IP。
5.2.5亿个整数中找出不重复的整数,内存空间不足以容纳这2.5亿个整数。
6.海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10。
7.怎么在海量数据中找出重复次数最多的一个
8.上千万or亿数据(有重复),统计其中出现次数最多的前N个数据。
统计可以用hash,二叉数,trie树。对统计结果用堆求出现的前n大数据。增加点限制可以提高效率,比如 出现次数>数据总数/N的一定是在前N个之内
9.1000万字符串,其中有些是相同的(重复),需要把重复的全部去掉,保留没有重复的字符串。请问怎么设计和实现?
10.一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前十个词。请给出思想,给时间复杂度分析。
11.一个文本文件,也是找出前十个最经常出现的词,但这次文件比较长,说是上亿行或者十亿行,总之无法一次读入内存,问最优解。
12.有10个文件,每个文件1G, 每个文件的每一行都存放的是用户的query,每个文件的query都可能重复要按照query的频度排序
13.100w个数中找最大的前100个数
14.寻找热门查询:
搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有一千万个记录,这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。请你统计最热门的10个查询串,要求使用的内存不能超过1G。
(1)请描述你解决这个问题的思路;
(2)请给出主要的处理流程,算法,以及算法的复杂度。
15.一共有N个机器,每个机器上有N个数。每个机器最多存O(N)个数并对它们操作。如何找到N^2个数的中数(median)?

原创粉丝点击