您的位置:首页 > 职场人生

近期面试总结

2014-05-21 20:50 260 查看
hadoop 相关

1. shuffle,combine,partition 的作用和意义

shuffle: Map 阶段:sort ,spill to disk, merge

reduce阶段:copy data from map result ,merge the same key data

combine :

将Map的结果进行一个类似reduce的操作,可以减少数据的传输

partition:

把map的结果按照不同的key分发到不同的reduce

2.二次排序

Map sort: key=key+value

reduce merge: key = 真正的key

3. 1 reduce数据倾斜:一批reduce task,有个别长时间未结束

3.2 Map端:个别Map长时间未结束,可能的原因???

4.优化配置参数

数据挖掘相关

1.聚类分类的区别

supervised & unsupervised algorithems

2.常用的聚类

k-means ,knn, 层次聚类

实用排序

1.给出N个无序的数,然后找出其中最大的k个数

解题思路:

首先测试数据有可能会有一亿个数,数据量特别的大,数据库不可能存储这么多的数据。如果直接sort排序,NlogN时间复杂度实在是太高,大于10^9。我们可以考虑对数据进行分块读取,每次读取的数据块大小应大于k。

不如先假设第一次读取的数据块前k个数最大,然后把k个数建成最小二叉堆。然后从第k+1个数开始,每个数都与堆顶的数值进行比较,如果数字i大于堆顶则把堆顶的元素的元素替换成i,再调整一次堆。最后读取完数据之后,这个二叉堆里面的元素就是从小到大排序好的最大k个数。

时间复杂度:O(NlogK)

空间复杂度:O(K)

证明过程:

为什么求最大的k个用的不是最大堆,而是最小堆?最大堆堆顶的元素是最大的,往下的子树越来越小,把N个数建成最大堆,那么堆顶往下的k个数就是最大的k个数。但是时间复杂度O(NlogN)和空间复杂度O(N)太高!

排序时间复杂度很高,是因为进行了很多没有用的判断,我们只需要取最大的k个数,而排序则把N个数都从小到大排序好了。建立一个k个数的最小堆,假设堆里面的元素是最大的,当然只是假设。如果从M+1到N这些数只要有数大于最小堆堆顶的数,那么假设就不成立,堆顶那个数就不符合,自然把它去掉,把新的数加进来,再重新调整堆,使得堆顶的元素最小。

为什么要用最小堆呢?因为每次查找这k个数里面的最小的那个数就是堆顶,时间复杂度是O(1)。如果直接用数组来存储这k个数,虽然查找的时间复杂度是logN,但是当把这个数插入数组的时候,数组比它小其他元素还需要往前平移,所以时间复杂度远远大于logN。由于每次调整堆的时间复杂度是logN。所以最小堆的做法的时间复杂度是

O(NlogK),而空间复杂度只有O(K)。

搜索引擎

1.倒排索引

2.tf-idf

3.搜索引擎结果排序算法,分页排序算法??
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: