近期面试总结
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.搜索引擎结果排序算法,分页排序算法??
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.搜索引擎结果排序算法,分页排序算法??
相关文章推荐